【问题标题】:Zip file is 1Kb file instead actual file size when downloaded via .NET Web APIZip 文件是 1Kb 文件,而不是通过 .NET Web API 下载时的实际文件大小
【发布时间】:2021-04-12 16:40:43
【问题描述】:

我正在通过 Web API 端点压缩多个文件,然后将其下载到我的浏览器。直到最后一步,我可以看到 zip 文件有一个文件名,并且它的大小已设置,但由于某种原因,下载后它以 1Kb 文件的形式返回。

我已将包含 zip 文件的二进制数组保存到我的本地驱动器,然后通过 Web API 将其返回给浏览器,这确实是正确的。我可以打开 zip 文件并查看其内容,所以我不确定是什么导致了问题。

显然不是压缩,因为我可以将它保存在本地并且它是正确的,所以我只能假设它必须与端点有关,但是什么?我使用自定义的 IHttpActionResult:

public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
    HttpResponseMessage response = new HttpResponseMessage();

    var filename = this.Document.GetFilename();

    var mimeType = MimeMapping.GetMimeMapping(filename);
    response.Content = new StreamContent(new MemoryStream(this.Document.ToData()));
    response.Content.Headers.ContentLength = this.Document.Data.Length;
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = filename
    };
    response.Content.Headers.ContentType = new MediaTypeHeaderValue(mimeType);

    return Task.FromResult(response);
}

对我来说它看起来不错,奇怪的是,如果我下载 MS Word 或其他文档,使用自定义 IHttpActionResult 和相同的端点下载就好了。

为了通过 Web API 和 JQuery 下载文件,我找到了以下文章:

DOWNLOAD FILE WITH JQUERY AND WEB API 2.0 IHTTPACTIONRESULT

可能是在文件完全下载之前保存 blob,但为什么它适用于其他文件?

如果您希望我提供任何其他代码,请告诉我,但如果有人有任何建议会很棒。

谢谢。

UPDATE-1:

与之前所说的不同,我的单个文件下载(例如 MS Word)也不再工作,并且还会生成一个 1kb 文件而不是相关文件。有些事情发生了变化,但我不确定是什么。当我发现时会发布更新。

【问题讨论】:

  • this.Document.Data.Length 给出的值是否正确?
  • @amy 据我所知,确实如此。我已经纠正了我的问题,因为我刚刚注意到我说它适用于 MS word 之类的东西,而我的问题只是 Zip 文件,但事实并非如此。问题出在所有文件上,所以我必须更改某些内容,因为我最初只处理单个文件下载但我不确定是什么。我看看能不能发现什么。我会更新我的问题以免引起混淆,希望我能找出发生了什么变化并发布更新。真的很奇怪,设置长度的时候,肯定是大于1k的值。

标签: c# asp.net-web-api asp.net-web-api2


【解决方案1】:

我已经通过使用直接提供的代码解决了这个问题:

Handle file download from ajax post

来自@JonathanAmend(向他致敬!!)

success: function(blob, status, xhr) {
    // check for a filename
    var filename = "";
    var disposition = xhr.getResponseHeader('Content-Disposition');
    if (disposition && disposition.indexOf('attachment') !== -1) {
        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
        var matches = filenameRegex.exec(disposition);
        if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
    }

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        var URL = window.URL || window.webkitURL;
        var downloadUrl = URL.createObjectURL(blob);

        if (filename) {
            // use HTML5 a[download] attribute to specify filename
            var a = document.createElement("a");
            // safari doesn't support this yet
            if (typeof a.download === 'undefined') {
                window.location.href = downloadUrl;
            } else {
                a.href = downloadUrl;
                a.download = filename;
                document.body.appendChild(a);
                a.click();
            }
        } else {
            window.location.href = downloadUrl;
        }

        setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
    }

一些细微的差别:

  1. 我的代码在 completed 承诺而不是 success

  2. 我的 ajax 请求中没有以下代码

    xhr 字段:{ // 避免二进制数据在字符集转换时被破坏 响应类型:'blob' },

  3. 他的代码与我在原始问题中提供的DOWNLOAD FILE WITH JQUERY AND WEB API 2.0 IHTTPACTIONRESULT 中找到的代码之间没有细微差别,但我现在没有时间比较两者。我会在周末尝试这样做并更新我的答案,但从我目前看到的情况来看,这些差异似乎不太可能导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多