我正在开展一项任务,我必须以xlsx格式下载报告.报表文件从服务器成功生成,并在客户端接收.但是它不是打开并且产生无效的格式错误.下面是服务器端的代码.
var output = await reportObj.GetExcelData(rParams); if (output != null){ var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(output.ConentBytes) }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = output.FileName }; return result; }
以下是客户端的代码:
var saveData = function (response) { if (response.status === 200) { var reportData = response.data; var b = new Blob([reportData],{ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); saveAs(b,"ReportFile.xlsx");//this is FileSaver.js function } else { console.log(response.statusText); } }; $scope.getExcelFile = function(reportName,reportParams) { reportDataService.getExcelReportData(reportName,reportParams,saveData); }
以下是错误信息:
由于某些内容不可读,Excel无法打开newFile.xlsx.您要打开并修复此工作簿吗?
点击修复,出现以下错误:
Excel无法打开此文件.
文件格式或文件扩展名无效.验证文件是否已损坏,并且文件扩展名与文件的格式相符.
有人可以指导我做错了什么?同时,同一个服务器端的文件生成器对象在ASP.Net表单应用程序中工作顺利,文件也打开没有任何错误.
谢谢.
解决方法
我希望你的$http调用丢失响应类型配置.这是我下载办公文件的方式:
function download(url,defaultFileName) { var self = this; var deferred = $q.defer(); $http.get(url,{ responseType: "arraybuffer" }).then( function (data,status,headers) { var type = headers('Content-Type'); var disposition = headers('Content-Disposition'); if (disposition) { var match = disposition.match(/.*filename=\"?([^;\"]+)\"?.*/); if (match[1]) defaultFileName = match[1]; } defaultFileName = defaultFileName.replace(/[<>:"\/\\|?*]+/g,'_'); var blob = new Blob([data],{ type: type }); saveAs(blob,defaultFileName); deferred.resolve(defaultFileName); },function (data,status) { var e = /* error */ deferred.reject(e); }); return deferred.promise; }