首页 新闻 会员 周边

高难度:jQuery以Post方式发送请求并获取返回的文件供下载!

0
悬赏园豆:15 [已解决问题] 解决于 2012-10-09 10:44

我的想法是这样的,在页面上用jQuery的$.post方法发送一个请求给服务器(由于要传递的参数是经过Base64编码的很长的字符串,所以使用Post方式),然后服务器根据这个参数再生成相应的一个文件流返回给客户端。此时,问题来了,在$.post方法的回调函数中,只能处理xml, json, script, or html类型,对返回的文件流却没办法弹出对话框让用户下载了。

大家有没有什么方法可以让浏览器弹出下载对话框来让用户下载这个文件呢?或者有替代方法也可以给个思路,谢谢!

戒焦戒躁的主页 戒焦戒躁 | 初学一级 | 园豆:15
提问于:2012-03-29 09:29
< >
分享
最佳答案
-11

用ajax请求文件下载当然是可以的,不用有返回值,代码差不多是这样:

try
{
string FileName = ".//doc//[大家网]Beginning.ASP.NET.2.0.E-Commerce.in.C#.2005.From.Novice.to.Professional[www.TopSage.com].pdf";
FileName = ".//doc//Shipping+Advice+Spec++V1.4.xls";
FullFileName = Server.MapPath(FileName);
//FileName--要下载的文件名
FileInfo DownloadFile = new FileInfo(FullFileName);
if (DownloadFile.Exists)
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII));
Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
Response.WriteFile(DownloadFile.FullName);
Response.Flush();
Response.End();
}
else
{
//文件不存在
}
}
catch
{
//打开时异常了
}
收获园豆:8
草根程序猿 | 初学一级 |园豆:129 | 2012-03-29 10:13

我问的是客户端如何处理返回的文件,而不是服务器端的处理。

戒焦戒躁 | 园豆:15 (初学一级) | 2012-03-29 10:15
其他回答(4)
5

Ajax本身貌似就不支持异步文件下载

解决方法有两种:

  一.用window.open()打开这个文件或者链接的地址.

  二.创建一个隐藏的iframe,将其src属性设置为方法的链接地址,然后加到页面上去.

收获园豆:5
paseo | 园豆:262 (菜鸟二级) | 2012-03-29 13:25
-5

既然已经获取到数据,在回调函数中弹出对话框,点确定进行写文件操作,就能得到想要的文件。

收获园豆:2
积跬步 | 园豆:214 (菜鸟二级) | 2012-04-29 10:28

貌似你的思路好像可以,我试一下...

支持(0) 反对(0) 小侠女 | 园豆:204 (菜鸟二级) | 2012-10-22 15:22
0

我也在纠结于这个问题,我现在做的东西的策略是先在服务端写好文件,再提供下载链接。但是,这post请求发出以后,后台准备数据和写文件的时间可能较长,我怎么检测文件已经生成完毕,并response回来一个文件呢?或者更智能点儿,就是弹出一个保存对话框,让用户选择保存路径。

小侠女 | 园豆:204 (菜鸟二级) | 2012-10-22 15:21
0

var ImgUrl = $(data).filter("center").find("img").attr("src") || "";
var $inputContent = $('<input>').attr({ name: "ResumeBody", value: escape(data) });
var $inputImg = $('<input>').attr({ name: "ImgUrl", value: ImgUrl });
var $form = $("<form>");
$form.attr({ target: '_self', method: 'post', action: '/webinterface/JsdlResumePreview.ashx' }).append($inputContent).append($inputImg);
$form.submit();

JsdlResumePreview.ashx这个页面回传值就是一个文件stream  用的是response.outputSteam.write方法,看来楼上说的对用jquery post方法直接调用这个地址 是不会下载到东西的返回一堆乱码!

nod22 | 园豆:206 (菜鸟二级) | 2013-09-04 14:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册