使用 AngularJS 从 Asp.net Web API 2 下载 Excel
Download Excel from Asp.net Web API 2 using AngularJS
我环顾四周,似乎很多人都有同样的问题,正在下载的文件已损坏。我在前端使用 web api 2 和 angular。
服务器端
[Route("api/export/{id}")]
public async Task<IHttpActionResult> GetFileAsync(Guid id)
{
var originalFile = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/template.xls");
var stream = _exportService.Export(id, originalFile);
return new FileActionResult(stream);
}
public class FileActionResult : IHttpActionResult
{
private Stream Data { get; }
public FileActionResult(Stream data)
{
Data = data;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage
{
Content = new StreamContent(Data)
};
//response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
//response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
//response.Content.Headers.ContentDisposition.FileName = "ExportedCOBie.xls";
response.Content.Headers.ContentLength = Data.Length;
return Task.FromResult(response);
}
}
angular 客户
function(Restangular, FileSaver, Blob) {
this.exportToCobie = function(projectId) {
toastr.info('Exporting data', 'Info');
Restangular.one("export/" + projectId)
.get({ responseType: "arraybuffer" })
.then(function (data) {
var file = new Blob([data], { type: 'application/vnd.ms-excel' });
FileSaver.saveAs(file, 'export.xls');
})
}
}
非常感谢任何帮助,谢谢。
public MemoryStream Export(Guid projectId, string file)
{
try
{
var fileStream = new FileStream(file, FileMode.Open);
_workbook = new HSSFWorkbook(fileStream);
fileStream.Close();
var contacts = _uow.ContactRepository.FindAllBy(c => c.ProjectId == projectId);
//var fileOutputStream = new FileStream(file, FileMode.Create);
var memoryStream = new MemoryStream();
_workbook.Write(memoryStream);
memoryStream.Position = 0;
return memoryStream;
}
catch (Exception exception)
{
_logger.Error(exception.Message);
}
return null;
}
我在尝试下载 pdf 时遇到了同样的问题。我记不清问题出在哪里了,但这是我的工作成功回调:
function success(res) {
var file = new Blob([res.data], { type: 'application/pdf' });
var fileName = 'somefilename' + moment().format('YYYYMMDDTHHmm') + '.pdf';
if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
$window.navigator.msSaveOrOpenBlob(file, fileName);
} else {
var a = document.createElement('a');
a.href = URL.createObjectURL(file);
a.target = '_blank';
a.download = fileName;
document.body.appendChild(a);
a.click();
}
}
希望对您有所帮助。
如果其他人对 Restangular 做了同样的事情,下面的代码就发挥了作用,希望对您有所帮助!
(function () {
'use strict';
angular
.module('app.cobie.export')
.service('CobieExportDataService', ['Restangular', 'FileSaver', 'Blob',
function (Restangular, FileSaver, Blob) {
this.exportToCobie = function (projectId) {
toastr.info('Exporting COBie data', 'Info');
return Restangular.withConfig(function(RestangularConfigurer) {
RestangularConfigurer.setDefaultHttpFields({
cache : false ,
responseType: "arraybuffer",
});
}).one("export/" + projectId).get().then(function (res) {
var data = new Blob([res], { type: 'application/vnd.ms-excel' });
FileSaver.saveAs(data, 'export.xls');
})
}
}]);
})();
我环顾四周,似乎很多人都有同样的问题,正在下载的文件已损坏。我在前端使用 web api 2 和 angular。
服务器端
[Route("api/export/{id}")]
public async Task<IHttpActionResult> GetFileAsync(Guid id)
{
var originalFile = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/template.xls");
var stream = _exportService.Export(id, originalFile);
return new FileActionResult(stream);
}
public class FileActionResult : IHttpActionResult
{
private Stream Data { get; }
public FileActionResult(Stream data)
{
Data = data;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage
{
Content = new StreamContent(Data)
};
//response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
//response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
//response.Content.Headers.ContentDisposition.FileName = "ExportedCOBie.xls";
response.Content.Headers.ContentLength = Data.Length;
return Task.FromResult(response);
}
}
angular 客户
function(Restangular, FileSaver, Blob) {
this.exportToCobie = function(projectId) {
toastr.info('Exporting data', 'Info');
Restangular.one("export/" + projectId)
.get({ responseType: "arraybuffer" })
.then(function (data) {
var file = new Blob([data], { type: 'application/vnd.ms-excel' });
FileSaver.saveAs(file, 'export.xls');
})
}
}
非常感谢任何帮助,谢谢。
public MemoryStream Export(Guid projectId, string file)
{
try
{
var fileStream = new FileStream(file, FileMode.Open);
_workbook = new HSSFWorkbook(fileStream);
fileStream.Close();
var contacts = _uow.ContactRepository.FindAllBy(c => c.ProjectId == projectId);
//var fileOutputStream = new FileStream(file, FileMode.Create);
var memoryStream = new MemoryStream();
_workbook.Write(memoryStream);
memoryStream.Position = 0;
return memoryStream;
}
catch (Exception exception)
{
_logger.Error(exception.Message);
}
return null;
}
我在尝试下载 pdf 时遇到了同样的问题。我记不清问题出在哪里了,但这是我的工作成功回调:
function success(res) {
var file = new Blob([res.data], { type: 'application/pdf' });
var fileName = 'somefilename' + moment().format('YYYYMMDDTHHmm') + '.pdf';
if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
$window.navigator.msSaveOrOpenBlob(file, fileName);
} else {
var a = document.createElement('a');
a.href = URL.createObjectURL(file);
a.target = '_blank';
a.download = fileName;
document.body.appendChild(a);
a.click();
}
}
希望对您有所帮助。
如果其他人对 Restangular 做了同样的事情,下面的代码就发挥了作用,希望对您有所帮助!
(function () {
'use strict';
angular
.module('app.cobie.export')
.service('CobieExportDataService', ['Restangular', 'FileSaver', 'Blob',
function (Restangular, FileSaver, Blob) {
this.exportToCobie = function (projectId) {
toastr.info('Exporting COBie data', 'Info');
return Restangular.withConfig(function(RestangularConfigurer) {
RestangularConfigurer.setDefaultHttpFields({
cache : false ,
responseType: "arraybuffer",
});
}).one("export/" + projectId).get().then(function (res) {
var data = new Blob([res], { type: 'application/vnd.ms-excel' });
FileSaver.saveAs(data, 'export.xls');
})
}
}]);
})();