javascript - 从 POST 收到的响应已损坏

标签 javascript c# ajax post blob

我有一个名为 DownloadZipFile 的服务,它会整理数据,然后构建一个 Zip 文件以供下载。该服务返回包含文件流的响应

服务:

[HttpPost]
public ActionResult DownloadZipFile(string zipData)
{
    try
    {
        // Create the Zip File.
        using (MemoryStream zipStream = DownloadHelper.BuildZipFileData(zipData))
        {
            // Build up the reponse including the file.
            HttpContext.Response.ClearContent();
            HttpContext.Response.ClearHeaders();
            HttpContext.Response.Clear();
            HttpContext.Response.Buffer = true;
            HttpContext.Response.ContentType = "application/zip";
            HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=MyZipFile.zip;");
            HttpContext.Response.BinaryWrite(zipStream.ToArray());
            HttpContext.Response.End();
        }
    }
    catch (Exception e)
    {
        // Log the error.
        _logService.Error(LogHelper.GetWebRequestInfo(ControllerContext.HttpContext.Request), e);
    }
 }

如果我像这样调用服务,它将正确下载并打开 zip 文件。

服务调用#1
var form = $("<form></form>").attr('action', "DownloadZipFile").attr("method", "post");
form.append($("<input></input>").attr("type", "hidden").attr("name", "zipData").attr('value', escape(JSON.stringify(zipData))));
form.appendTo('body').submit().remove();

但是,如果我在将其从响应转换为 blob 时使用 AJAX Post 调用,则大小会比我发送的大得多。

服务调用#2:

$.post("DownloadZipFile", { zipData: escape(JSON.stringify(zipData)) },
     function (data, status, response) {
         var filename = "";
         var disposition = response.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, '');
         }

         var type = response.getResponseHeader('Content-Type');
         var blob = new Blob([data], { type: type });

         if (typeof window.navigator.msSaveBlob !== 'undefined') {
             window.navigator.msSaveBlob(blob, filename);
         } else {
             var URL = window.URL || window.webkitURL;
             var downloadUrl = URL.createObjectURL(blob);
             if (filename) {
                 var a = document.createElement("a");
                 if (typeof a.download === 'undefined') {
                     window.location = downloadUrl;
                 } else {
                     a.href = downloadUrl;
                     a.download = filename;
                     document.body.appendChild(a);
                     a.click();
                 }
             } else {
                 window.location = downloadUrl;
             }
         }
     });

使用服务调用#2,我得到的 Zip 文件已损坏

难道是编码的问题?我检查了正确和错误 Zip 文件之间的数据,它们如下所示:

正确的 zip :

PK ú‚ÐJmÇ´¸g € BOM.csvu‘ËNà0 E÷HüÈ+ÆÑØy/›”WÔðH[ä64IÕŸ| >‰_ÀN(-¢l®,Ýã;wìÏ÷‡m^Ö³ú 35VkUŽtÕf6)óºZcZjqz"0 dÒ³ü9TÓ%yd#ˆ3ÖŽR´¡kÙMYæt 2'ÒâÉɽdÈhO¶"BXÁ?ùÚ”Ç<‰,ÖÍ ‘ ååÎé ÁÝ!Ò ²AˆVG ]3

损坏的邮政编码:

PK ï¿¿ï¿¿ï¿¿g ï¿¿ BOM.csvuï¿¿ï¿¿¿Eï¿¿ï¿¿+ï¿¿ï¿¿/ï¿¿ï¿¿Wï ??H[??4??IÕ|| >ï¿¿_ï¿¿(-ï¿¿lï¿¿,ï¿¿;wï¿¿ï¿¿ï¿¿m^ֳ￿kUï¿¿tï¿¿6)ï¿¿Zjqz"0 dÒ³ï ¿¿yd#ï¿¿3Ö~Rï¿¿ï¿¿kï¿¿MYï¿¿2'￿￿ɽdï¿¿Oï¿"BXï¿¿ï¿¿ ¿¿ ï¿¿ï¿¿ï¿¿ï¿¿ï¿¿ï¿¿Aï¿¿VG ]3

文件的编码似乎不同。大家觉得怎么样?

最佳答案

谢谢穆萨给我这个线索。

现在这是我用来下载 Zip 文件的服务调用:

服务调用#1
    var xhrq = new XMLHttpRequest();
    xhrq.onreadystatechange = function () {
        if (this.readyState == 4 ) {
            if (this.status == 200) {
                var xhrp = this;
                var response = this.response;

                // check for a filename
                var filename = "";
                var disposition = xhrp.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, '');
                }

                var type = xhrp.getResponseHeader('Content-Type');
                var blob = new Blob([response], { type: type, encoding: "UTF-8" });

                if (typeof window.navigator.msSaveBlob !== 'undefined') {
                    window.navigator.msSaveBlob(blob, filename);
                } else {
                    var URL = window.URL || window.webkitURL;
                    var downloadUrl = URL.createObjectURL(blob);

                    if (filename) {
                        var a = document.createElement("a");
                        if (typeof a.download === 'undefined') {
                            window.location = downloadUrl;
                        } else {
                            a.href = downloadUrl;
                            a.download = filename;
                            document.body.appendChild(a);
                            a.click();
                        }
                    } else {
                        window.location = downloadUrl;
                    }
                    setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
                }
            } else {

   // Call Back for Error
            }
        }
    }

    // Open HTTP Request and Call API Function
    xhrq.open("POST", appPath + "DownloadZipFile");
    xhrq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xhrq.responseType = 'blob';
    xhrq.send('designData=' + escape(JSON.stringify(zipData)));

关于javascript - 从 POST 收到的响应已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689688/

相关文章:

javascript - 为什么 'new Promise(...)' 返回 'undefined' ?

javascript - 使用 jQuery 更新 CSS 属性

c# - 为什么保存了 'in progress' 后测试结果有时还是 'passed'?

php - 收到新消息时播放声音

javascript - HTML 表 - 迭代行并对字段求和

javascript - JavaScript 中的指针?

c# - 如何替换 C# 字符串中的特定字符?

c# - 如何将 UTF-8 阿拉伯字母转换为 CodePage 1001?

php - 如何从mysql表中选择数据

javascript - 我需要一些 javascript 条件,比如媒体查询