首页 文章

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

提问于
浏览
1

好吧,我多年来一直把头发拉出来 . 我有一个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

    有几个简单的解决方案 .

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

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

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

  • 1

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

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

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

相关问题