如何下载zip文件
如何下载zip文件
我正在尝试从我的Web API控制器下载一个zip文件。它返回了文件,但是当我试图打开时,我收到了一个无效的zip文件的消息。我看到其他帖子中的回答是添加responseType:\'arraybuffer\',但对我来说仍然不起作用。控制台中也没有任何错误信息。\n
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(); });
\nAPI控制器:\n
[HttpPost] [ActionName("ZipFileAction")] public HttpResponseMessage ZipFiles([FromBody]int[] id) { if (id == null) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest)); } Listdocuments = new List (); 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; } }
\n更新:\n图片链接: [pic](https://i.stack.imgur.com/gDow3.png)
问题:如何下载一个zip文件?
原因:要下载一个zip文件,需要通过HTTP请求获取文件的二进制数据,并将其转换为Blob对象。然后,需要创建一个下载链接,将Blob对象的URL赋给该链接的href属性,并设置下载属性为文件名。最后,触发点击事件,实现文件的下载。以上代码中的Controller和Services部分实现了这个功能。
解决方法:
1. 在Controller中,定义一个downloadExport函数,该函数接受三个参数:id、filename和frmdata。
2. 在函数体内,将frmdata设置为空对象。
3. 调用tdioServices服务的downloadexport函数,传入id、filename和frmdata作为参数。该函数返回一个$http请求。
4. 在返回的请求中,设置请求方法为GET,请求URL为APP_URL+'/exports/'+id+'/download/'+filename,请求数据为frmdata,响应类型为arraybuffer。
5. 在Controller中定义一个data变量,用于存储请求的结果。
6. 调用data的success方法,该方法接受一个回调函数作为参数。在回调函数内部执行以下操作:
- 创建一个Blob对象,使用请求结果success作为参数,设置类型为arraybuffer。
- 创建一个下载链接downloadLink,使用angular.element方法创建一个a标签。
- 将Blob对象的URL赋给downloadLink的href属性。
- 设置downloadLink的download属性为filename。
- 触发downloadLink的click事件,实现文件下载。
- 设置$COMMON_ACCEPT为"Download Successfully",$COMMON_ACCEPT_TEXT为"Success"。
- 使用toastr.success方法显示下载成功的提示信息,传入$COMMON_ACCEPT和$COMMON_ACCEPT_TEXT作为参数。
7. 在Services中,定义一个downloadexport函数,该函数接受三个参数:id、filename和frmdata。
8. 在函数体内,使用$http方法发送一个GET请求,请求URL为APP_URL+'/exports/'+id+'/download/'+filename,请求数据为frmdata,设置响应类型为arraybuffer。
9. 返回该请求。
以上是解决下载zip文件的问题的方法。
如何下载一个zip文件
有时候我们需要从网页上下载一个zip文件,但是我们可能会遇到一些问题,比如点击下载按钮没有反应,或者下载的文件损坏无法打开。下面是一个解决这个问题的方法。
首先,在Ajax请求中添加responseType:'arraybuffer'
,这样可以确保接收到的数据是二进制数据。
接下来,使用以下代码来处理接收到的响应数据,从而实现文件的下载功能:
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();
上述代码创建了一个元素,并将响应数据封装为Blob对象。然后,将Blob对象的URL赋给元素的href属性,设置下载的文件名为"filename.zip"。最后,触发元素的click事件,即可弹出文件下载提示框。
通过上述步骤,我们可以成功下载zip文件,并且确保下载的文件可以正常打开。希望这个方法对您有所帮助!