如何下载zip文件

23 浏览
0 Comments

如何下载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));
    }
    List documents = 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)

0
0 Comments

问题:如何下载一个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文件的问题的方法。

0
0 Comments

如何下载一个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文件,并且确保下载的文件可以正常打开。希望这个方法对您有所帮助!

0
0 Comments

怎样下载一个zip文件

问题原因:设置responseType的位置错误

解决方法:将responseType参数放在$http.post方法的第三个参数中

参考链接:https://stackoverflow.com/a/21732039/1715829

问题原因:下载的pdf文件损坏

解决方法:可能需要在api控制器中进行一些修改

问题原因:get_Length()方法不支持,可能需要先下载完整的流文件。

0