我有这个代码的处理程序:
HttpRequest request = context.Request;
HttpResponse response = context.Response;
if (request["Type"] != null)
{
try
{
string resultFile = null;
string fileName = string.Empty;
int type = Convert.ToInt32(request["Type"]);
switch (type)
{
case 1:
fileName = "InnerQuery.doc";
resultFile = GenerateInnerQuery(Id);
break;
case 2:
fileName = "CourierQuery.doc";
resultFile = GenerateCourierQuery(Id);
break;
case 3:
fileName = "TransportDogovor.doc";
resultFile = GenerateTransportDogovor(Id);
break;
case 4:
fileName = "TransportQuery.doc";
resultFile = GenerateTransportQuery(Id);
break;
case 5:
fileName = "PassQuery.doc";
resultFile = GeneratePassQuery(Id);
break;
}
if (resultFile != null)
{
response.Clear();
response.AddHeader("pragma", "no-cache");
response.AddHeader("cache-control", "private");
response.CacheControl = "no-cache";
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}",
System.Web.HttpUtility.UrlPathEncode(fileName)));
response.OutputStream.Write(File.ReadAllBytes(resultFile), 0, (int)(new FileInfo(resultFile)).Length);
response.End();
}
}
catch (Exception ex)
{ }
}
在客户端上,我使用jQuery.post()发布数据到处理程序:
var handler = "GetWord.ashx?Type=6";
var initiationDateFrom = $("#<%=InitiationDateFromTxt.ClientID%>").val();
var initiationDateTill = $("#<%=InitiationDateTillTxt.ClientID%>").val();
var queryDateFrom = $("#<%=QueryDateFromTxt.ClientID%>").val();
var queryDateTill = $("#<%=QueryDateTillTxt.ClientID%>").val();
var queryNumber = $("#<%=NumberTxt.ClientID%>").val();
var initiator = $("#<%=InitiatorTxt.ClientID%>").val();
var state = $("#<%=StateList.ClientID%>").val();
$.post(handler,
{
InitiationDateFrom: initiationDateFrom,
InitiationDateTill: initiationDateTill,
QueryDateFrom: queryDateFrom,
QueryDateTill: queryDateTill,
QueryNumber: queryNumber,
Initiator: initiator,
State: state
}, function (data) {
/*here i should save my file*/
});
我在“数据”中收到二进制文件,但无法将其保存在客户端。
上次我使用:
window.location = handler;
但是使用jQuery.post它不起作用。
答案 0 :(得分:2)
这个问题的答案需要我更新的一点点
我遇到了以下图书馆:https://github.com/eligrey/FileSaver.js
同样在我的情况下,它就像下面这样简单:
至少这里的解决方案对我有用,我只需要在chrome(v37)中支持它。
<强>前言强>
我需要通过邮寄请求下载excel文件。所以这是我在阅读了几个规格和q&amp; as之后的解决方法。
在我的ajax调用设置中,我将响应类型设置为'blob':
'responseType': 'blob'
一旦收到成功的响应,你需要做一些小的DOM技巧来触发下载,如下所示:
var downloadLink = document.createElement('a');
downloadLink.download = 'export.xlsx';
downloadLink.innerHTML = 'Download File';
downloadLink.href = window.webkitURL.createObjectURL(data);
downloadLink.click();
答案 1 :(得分:1)
当您使用AJAX请求请求数据时,您需要在JavaScript中处理它。保存文件将无法使用。
您需要创建一个保存参数的form
,而不是使用AJAX请求。使用iframe
属性将响应指向隐藏的target
,浏览器将提供保存文件。
答案 2 :(得分:-1)
如上所述,有许多不同的方法。您可能希望先查看jQuery File Upload。
其次,您可能希望查看解决方案中包含闪存的几个选项(uploadify或swfupload)。我过去曾经使用过它们,但是他们满意地满足了我的需求 - 但并不完美。