好吧,我多年来一直把头发拉出来 . 我有一个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 回答
有几个简单的解决方案 .
转换服务器过程以使用
GET
请求,您可以使用window.open来初始化下载 .如果您想坚持
POST
,您可以创建一个隐藏的表单,其中包含每个参数的输入 . 将表单操作设置为POST
到您的服务URL并使用form.submit()
启动下载 .1 . 不要把它变成web服务 . 如果它总是提供一个zip文件,为什么它不是aspx或ashx?脚本请求的资源不必是ASMX .
第2位 . 你不能在AJAX或javascript中收到二进制文件是不正确的 . 您可以 . 例如,请参阅Unzipping zip archives with Javascript .
但请确保您确实想要在脚本中处理zip文件 . 在大多数情况下,您希望让用户将zip文件保存到文件系统 .