Angularjs 如何下载zip文件
我正在尝试从我的web api控制器下载一个zip文件。它正在返回文件,但我收到一条消息:当我尝试打开zipfile时,zipfile无效。我看过其他关于这方面的帖子,回复中添加了responseType:“arraybuffer”。还是不适合我。控制台中也没有任何错误Angularjs 如何下载zip文件,angularjs,asp.net-web-api,httpresponse,zipfile,pushstreamcontent,Angularjs,Asp.net Web Api,Httpresponse,Zipfile,Pushstreamcontent,我正在尝试从我的web api控制器下载一个zip文件。它正在返回文件,但我收到一条消息:当我尝试打开zipfile时,zipfile无效。我看过其他关于这方面的帖子,回复中添加了responseType:“arraybuffer”。还是不适合我。控制台中也没有任何错误 var model = $scope.selection; var res = $http.post('/api/apiZipPipeLine/', model) res.success(function
var model = $scope.selection;
var res = $http.post('/api/apiZipPipeLine/', model)
res.success(function (response, status, headers, config) {
saveAs(new Blob([response], { type: "application/octet-stream", responseType: 'arraybuffer' }), 'reports.zip');
notificationFactory.success();
});
api控制器
[HttpPost]
[ActionName("ZipFileAction")]
public HttpResponseMessage ZipFiles([FromBody]int[] id)
{
if (id == null)
{//Required IDs were not provided
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
}
List<Document> documents = new List<Document>();
using (var context = new ApplicationDbContext())
{
foreach (int NextDocument in id)
{
Document document = context.Documents.Find(NextDocument);
if (document == null)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
documents.Add(document);
}
var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) =>
{
try
{
using (var zipFile = new ZipFile())
{
foreach (var d in documents)
{
var dt = d.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-');
string fileName = String.Format("{0}-{1}-{2}.pdf", dt, d.PipeName, d.LocationAb);
zipFile.AddEntry(fileName, d.DocumentUrl);
}
zipFile.Save(outputStream); //Null Reference Exception
}
}
finally
{
outputStream.Close();
}
});
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
streamContent.Headers.ContentDisposition.FileName = "reports.zip";
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = streamContent
};
return response;
}
}
[HttpPost]
[ActionName(“ZipFileAction”)]
公共HttpResponseMessage ZipFiles([FromBody]int[]id)
{
if(id==null)
{//未提供所需的ID
抛出新的HttpResponseException(新的HttpResponseMessage(HttpStatusCode.BadRequest));
}
列表文档=新列表();
使用(var context=new ApplicationDbContext())
{
foreach(id中的int NextDocument文件)
{
文档=context.Documents.Find(NextDocument);
if(document==null)
{
抛出新的HttpResponseException(新的HttpResponseMessage(HttpStatusCode.NotFound));
}
文件。添加(文件);
}
var streamContent=新的PushStreamContent((outputStream、httpContext、transportContent)=>
{
尝试
{
使用(var zipFile=new zipFile())
{
foreach(文件中的var d)
{
var dt=d.DocumentDate.ToString(“y”).Replace(“/”,“-”).Replace(“:”,“-”);
string fileName=string.Format(“{0}-{1}-{2}.pdf”,dt,d.PipeName,d.LocationAb);
添加项(文件名,d.DocumentUrl);
}
zipFile.Save(outputStream);//空引用异常
}
}
最后
{
outputStream.Close();
}
});
streamContent.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/八位字节流”);
streamContent.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”);
streamContent.Headers.ContentDisposition.FileName=“reports.zip”;
var响应=新的HttpResponseMessage(HttpStatusCode.OK)
{
内容=流内容
};
返回响应;
}
}
更新
我认为您将responseType设置在了错误的位置,而不是:
$http.post('/api/apiZipPipeLine/', model)
试试这个:
$http.post('/api/apiZipPipeLine/', model, {responseType:'arraybuffer'})
查看更多详细信息。事实上,您正在正确添加
响应类型:'arraybuffer'
。当收到来自ajax的响应时,添加到以下代码中的将提示下载文件:
var a = document.createElement('a');
var blob = new Blob([responseData], {'type':"application/octet-stream"});
a.href = URL.createObjectURL(blob);
a.download = "filename.zip";
a.click();
下面的代码对我下载zip文件很好 控制器
$scope.downloadExport = function (id,filename,frmdata) {
frmdata = {};
var data = tdioServices.downloadexport(id,filename,frmdata);
data.success(function(success) {
var blob = new Blob([success], { type:"arraybuffer" });
var downloadLink = angular.element('<a></a>');
downloadLink.attr('href',window.URL.createObjectURL(blob));
downloadLink.attr('download', filename);
downloadLink[0].click();
$COMMON_ACCEPT = "Download Successfully";
$COMMON_ACCEPT_TEXT = "Success";
toastr.success($COMMON_ACCEPT, $COMMON_ACCEPT_TEXT);
});
};
saveAs
函数中有什么?它是一个filesaver.js方法,确实有效!但是pdf文件是否已损坏?我是否需要更改api控制器中的某些内容?我在api中发布了一个异常的屏幕截图。我知道这可能是一个单独的问题,但如果你能看一看,我会很感激它不支持get_Length(),也许你需要先下载整个流?
this.downloadexport = function(id,filename,frmdata){
var request = $http({method:'get', url:APP_URL+'/exports/'+id+'/download/'+filename, data:frmdata,responseType:'arraybuffer'});
return request;
}