如何通过 angularJS 和 webaAPI2 下载内存流对象
How to download memory stream object via angularJS and webaAPI2
我有一个项目,我正在使用 NPOI 从我的 Angular 应用程序生成 Excel 文档。我的 angular 服务对我的 webapi 控制器进行了如下调用:
function exportReportToExcel(report) {
return $http.post('reportlibrary/exportReport/', report, {
}).then(function (response) {
return response.data;
});
};
在控制器中,我进行了以下调用
[HttpPost]
public HttpResponseMessage ExportReport([FromBody]DTOs.Report report)
{
try
{
IReportPersistenceManager manager = ContainerConfigurator.Instance.Resolve<IReportPersistenceManager>();
MemoryStream ms = new MemoryStream();
//we have to pass to the NOPI assemble file type as well as file name
//since we only deal with excel for now we will set it but this could be configured later.
long id = report.ReportId;
string mimeType = "application/vnd.ms-excel";
string filename = "unknown";
manager.ExportDataToExcel(id, (name, mime) =>
{
mimeType = mime;
filename = name;
return ms;
});
ms.Position = 0;
var response = new HttpResponseMessage();
response.Content = new ByteArrayContent(ms.ToArray());
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
return (response);
}
catch (Exception)
{
//error
return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
}
}
这是从 MVC 应用程序的迁移,之前我能够 return 使用 System.IO.File 的对象到 return 对象以及关闭流。
我从来没有用 Angular 做过这件事,但从我读到的内容看来,我可以将 memorystream 对象放入 byteArray 并将其传回给客户端。
如果这是正确的方法,我该如何在它返回到 angular 服务和控制器后解开这个对象。
此处的目标是允许用户将以前保存的报告下载为 Excel 文件。
我走在正确的轨道上吗?有没有更有效的方法来下载内存流对象?如何将此上下文传递给浏览器?
提前致谢
我遇到了类似的问题。我解决了更改端点以支持 GET 并从新选项卡调用此方法的问题。
因此,在您的 angular 应用程序中,您必须创建一个新选项卡,指向调用生成文档的方法的路径。您可以使用下一个代码打开一个选项卡:
$window.open(path)
我认为在下一个 link 你可以得到你需要的所有信息:
Download file from an ASP.NET Web API method using AngularJS
希望对您有所帮助。
我有一个项目,我正在使用 NPOI 从我的 Angular 应用程序生成 Excel 文档。我的 angular 服务对我的 webapi 控制器进行了如下调用:
function exportReportToExcel(report) {
return $http.post('reportlibrary/exportReport/', report, {
}).then(function (response) {
return response.data;
});
};
在控制器中,我进行了以下调用
[HttpPost]
public HttpResponseMessage ExportReport([FromBody]DTOs.Report report)
{
try
{
IReportPersistenceManager manager = ContainerConfigurator.Instance.Resolve<IReportPersistenceManager>();
MemoryStream ms = new MemoryStream();
//we have to pass to the NOPI assemble file type as well as file name
//since we only deal with excel for now we will set it but this could be configured later.
long id = report.ReportId;
string mimeType = "application/vnd.ms-excel";
string filename = "unknown";
manager.ExportDataToExcel(id, (name, mime) =>
{
mimeType = mime;
filename = name;
return ms;
});
ms.Position = 0;
var response = new HttpResponseMessage();
response.Content = new ByteArrayContent(ms.ToArray());
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
return (response);
}
catch (Exception)
{
//error
return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
}
}
这是从 MVC 应用程序的迁移,之前我能够 return 使用 System.IO.File 的对象到 return 对象以及关闭流。
我从来没有用 Angular 做过这件事,但从我读到的内容看来,我可以将 memorystream 对象放入 byteArray 并将其传回给客户端。
如果这是正确的方法,我该如何在它返回到 angular 服务和控制器后解开这个对象。
此处的目标是允许用户将以前保存的报告下载为 Excel 文件。
我走在正确的轨道上吗?有没有更有效的方法来下载内存流对象?如何将此上下文传递给浏览器?
提前致谢
我遇到了类似的问题。我解决了更改端点以支持 GET 并从新选项卡调用此方法的问题。
因此,在您的 angular 应用程序中,您必须创建一个新选项卡,指向调用生成文档的方法的路径。您可以使用下一个代码打开一个选项卡:
$window.open(path)
我认为在下一个 link 你可以得到你需要的所有信息:
Download file from an ASP.NET Web API method using AngularJS
希望对您有所帮助。