我正在使用 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文件
和HTTP响应代码为200(这意味着请求没有问题)。我很困惑,为什么这不起作用。
请帮忙!
谢谢, Vaibinewbee
答案 0 :(得分:2)
浏览器可能期望获得JSON或XML响应,而是获得一大堆二进制数据。据我所知,您无法下载带有AJAX请求的文件,而是需要让浏览器导航到将下载文件的URL。
这可以通过类似通用处理程序(如果在asp.net webforms中)或返回文件的动作方法(如果是MVC)来实现。您可以使用window.location
从Javascript导航,或创建<a>
标记,并将href
设置为下载文件的位置,将您需要的任何参数作为查询字符串传递,然后浏览器将按预期工作。