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

时间:2014-01-14 18:33:55

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

我正在使用 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 个答案:

答案 0 :(得分:2)

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

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