【问题标题】:BadRequest unexpected token ILLEGAL when downloading ZIP file下载 ZIP 文件时出现 BadRequest 意外令牌非法
【发布时间】:2014-01-14 18:33:55
【问题描述】:

我正在为我的 UI 和 Ajax 调用 (DirectMethods) 使用 Ext.Net 开发一个 asp.net 应用程序。我正在尝试使用 DotNetZip 在服务器上下载一个 zip 文件。下载过程分为两部分:

  • 第 1 部分:首先调用方法 ExportXML 将内存中的 XML 导出到服务器上文件夹中的物理 XML 文件。

  • 第 2 部分:ExportXML 方法成功调用 DownloadZipFile。该方法使用 DotNetZip 压缩这些 XML 文件,并在 ZipFile 对象上调用 Save 方法来调用浏览器上的下载。

客户端 Ext.Net 代码

Ext.net.DirectMethods.ExportXML(ids, {
                success: function (zipID) {
                    Ext.net.DirectMethods.DownloadZipFile(zipID);
                },
                eventMask: {
                    showMask: true,
                    msg: "Creating XML files... This may take some time..."
                }
            });

服务器端 DirectMethods

[DirectMethod]
    public void DownloadZipFile(string randomFolderName)
    {
        var zippedXMLFiles = new ZipFile();
        var filePath = System.IO.Path.Combine(m_baseExportFolder, randomFolderName);

        Response.AddHeader("Content-Disposition", "attachment; filename=massExportXML.zip");
        Response.ContentType = "application/zip";
        var xmlDir = new DirectoryInfo(filePath);
        foreach (var fileInfo in xmlDir.GetFiles())
        {
            zippedXMLFiles.AddFile(fileInfo.FullName, string.Empty);
        }

        zippedXMLFiles.Save(Response.OutputStream);
    }

    [DirectMethod]


    public string ExportXML(string[] kCodes)
    {
        var folderID = System.IO.Path.GetRandomFileName();
        var folderPath = System.IO.Path.Combine(m_baseExportFolder, folderID);
        System.IO.Directory.CreateDirectory(folderPath);

        foreach (var kCode in kCodes)
        {
            GenerateXML(Convert.ToInt32(kCode), folderPath);
        }

        return folderID;
    }

GenerateXML 是将内存中的 XML 转换为物理 XML 文件的方法。

我的代码成功运行以创建 zip 文件并添加 zip 文件,但是,在我看到的浏览器上

和 HTTP 响应代码为 200(这意味着请求没有问题)。我很困惑为什么这不起作用。

请帮忙!

谢谢, 维比纽比

【问题讨论】:

    标签: c# asp.net xml ext.net dotnetzip


    【解决方案1】:

    浏览器可能期待 JSON 或 XML 响应,但实际上得到的是二进制数据块。据我所知,您不能通过 AJAX 请求下载文件,而是需要让浏览器导航到将下载文件的 URL。

    这可以通过通用处理程序(如果在 asp.net webforms 中)或返回文件的操作方法(如果 MVC)来完成。您可以使用window.location 从Javascript 导航,或者创建一个<a> 标记并将href 设置为下载文件的任何位置,将您需要的任何参数作为查询字符串传递,然后浏览器将按预期工作。

    【讨论】:

    • 谢谢马特。我单独存储了 Zip 文件,并在 AJAX 调用成功时将 window.location 设置为 zip 文件位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多