做项目中遇到了要下载数据库的文件并且在浏览器中打开,中间遇到了点问题 ,不过最终还是解决了。
步入正题:首先讲一下浏览器下载文件的逻辑。1.用户在客户端触发下载按钮。2.发送请求到服务端后台代码。3.服务端处理文件程序。4.返回到客户端前台。
先讲一下第3部分:写服务器代码时不同的编程语言代码会不相同,但是Http协议相同的, 所以无论是用.net java php 用mvc 还是不用mvc。都会得到想要的结果。
拿.net mvc框架为例子 下载代码;
public ActionResult DownLoad(int id)
{
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开 FilieName:要下载的文件名
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(FilieName, System.Text.Encoding.UTF8));
//byte[] 传输报文的流内容
Response.BinaryWrite(byte[]);
Response.Flush();
Response.End();
return null;
}
虽然我用的是 mvc control做的请求,但是我返回的并不是 control 的ActionResult 类型,而是设置 http报文流内容 ,并且以response响应的方式将报文返回给客户端。文件的二进制流的转换就不在赘述了 ,是通过文件路径,还是数据库字段那就是看你自己文件数据源的需求了。
4.第3部分处理完成之后。正常情况下浏览器页面会一个提示下载的提示框。不同浏览器是不同的,谷歌会直接在左下角下载,ie会提示下载。
不正常的情况就是浏览器没反应或者是报错。这里的主要原因就是第2部分请求的方式不对,千万不要用ajax或者jqurey的请求方式,因为他们的返回类型中没有流类型。
所以请求这可以用一个隐藏的form做提交 ,代码如下
function DownFile(id)
{
var form = $("<form>");//定义一个form表单
form.attr("style", "display:none");
form.attr("target", "");
form.attr("method", "post");
form.attr("action", "/AirportAi/DownLoadAi");
var input1 = $("<input>");
//需要添加的参数
input1.attr("type", "hidden");
input1.attr("name", "id");
input1.attr("value", id);
$("body").append(form);//将表单放置在web中
form.append(input1);
form.submit();
}
当然也可以用其他方式提交,这里就不在赘述了,只是总结经验如果有错误欢迎指正