首页 文章

下载ZIP文件时BadRequest意外标记ILLEGAL

提问于
浏览
0

我正在使用 Ext.Net 为我的UI和Ajax调用(DirectMethods)开发一个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文件,但是,我看到的浏览器

Error displayed when downloading the zip file

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

请帮忙!

谢谢,Vaibinewbee

1 回答

  • 2

    浏览器可能需要JSON或XML响应,而是获得一大堆二进制数据 . 据我所知,您无法下载带有AJAX请求的文件,而是需要让浏览器导航到将下载文件的URL .

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

相关问题