通过响应将Zip文件发送到客户端 - 发送的类型不正确

时间:2010-10-26 19:04:18

标签: asp.net jquery zip httpresponse

好吧,我多年来一直把头发拉出来。我有一个WebService,它将一个zip文件发送到浏览器。这有效;当我测试WebService并直接通过它“调用”方法时,zip文件会正确下载到浏览器中。

当我使用jQuery向WebService发送AJAX请求时出现问题 - zip文件被下载到响应中,但它保留在响应中,不会作为文件下载。

这是我的代码:

        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ContentType = "application/zip";
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment;         filename=pleasework.zip");


        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory("c:\\inetpub\\mediaserver\\music\\mixes");
            zip.AddFile("c:\\test.txt");
            zip.AddFile("c:\\test2.txt");
            zip.Save("c:\\filename.zip");
        }
        HttpContext.Current.Response.TransmitFile("c:\\iloveshrooms.zip");
        return "done";        
}

现在,当我在直接导航到服务时使用'invoke'功能下载文件时,这是有效的。

这是我的jQuery AJAX请求......

function getFile() {
            alert("sending POST request...");
            $.ajax({
                type:   'POST',
                url:    'ZipService.asmx/GetZipFile HTTP 1.1',
                contentType: "application/x-www-form-urlencoded",
                data:   '{ "path":"c:\\inetpub\\mediaserver\\music\\mixes"  }',
                dataType: '',
                beforeSend: function(xhr) {xhr.setRequestHeader("Accept","application/zip");},
                success: function() {alert(":-)");},
                failure: function() {alert(":-(");}
            });
        }

我在'beforeSend'中添加了代码,以便请求明确说明浏览器应该期望的响应类型。

我一直在使用Firebug来监控请求/响应标头,并且看不到它们有什么问题(除非我查看响应的内容,它充满了二进制数据并且与文件大小相同我要发送。

我只是尝试上传请求/响应标头的屏幕转储和响应内容但我没有足够的声誉点来执行此操作: - (

响应与Zip文件的大小相同,所以我假设它被发送回浏览器,但浏览器不知道如何处理它。

在IE,FF& Chrome和结果是一致的。

如果有人能对此有所了解,我会非常感激!

2 个答案:

答案 0 :(得分:1)

有几个简单的解决方案。

转换您的服务器程序以使用GET请求,您可以使用window.open来初始化下载。

window.open('your_procedure_url?parameter=xyz')

如果您想坚持使用POST,您可以创建一个隐藏的表单,其中包含每个参数的输入。将表单操作设置为POST到您的服务网址,然后使用form.submit()启动下载。

答案 1 :(得分:0)

第一。不要把它变成web服务。如果它总是提供一个zip文件,为什么它不是aspx或ashx?脚本请求的资源不必是ASMX。

第二。你不能在AJAX或javascript中收到二进制文件是不正确的。您可以。例如,请参阅Unzipping zip archives with Javascript

但请确保您确实想要在脚本中处理zip文件。在大多数情况下,您希望让用户将zip文件保存到文件系统。