今天项目要求做文件流下载,之中遇见了一些问题,在此记录一下。
问题1:后台怎样写文件流传到前台让浏览器进行下载
前端用一个<a>标签,href=“后台方法地址”>。如果你的需求不能直接用超链接方式,可以在js里写 window.location.href =“后台方法地址”。
这样跳转到后台方法后
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//获取要读取的文件的路径
String filePath =
this
.getClass().getClassLoader().getResource(
""
).toURI().getPath()
+
"/exportPdf.pdf"
;
//文件在项目中的路径
File outfile =
new
File(filePath);
String filename = outfile.getName();
// 获取文件名称
InputStream fis =
new
BufferedInputStream(
new
FileInputStream(
filePath));
byte
[] buffer =
new
byte
[fis.available()];
fis.read(buffer);
//读取文件流
fis.close();
response.reset();
//重置结果集
response.addHeader(
"Content-Disposition"
,
"attachment;filename="
+
new
String(filename.replaceAll(
" "
,
""
).getBytes(
"utf-8"
),
"iso8859-1"
));
//返回头 文件名
response.addHeader(
"Content-Length"
,
""
+ outfile.length());
//返回头 文件大小
response.setContentType(
"application/octet-stream"
);
//设置数据种类
//获取返回体输出权
OutputStream os =
new
BufferedOutputStream(response.getOutputStream());
os.write(buffer);
// 输出文件
os.flush();
os.close();
|
浏览器会直接识别这种形式的文件输出,弹出对话框。
注意此方法一定要用链接方式调后台,使用ajax和XMLHttpRequest方式都是不行的,这样返回的文件流会返回到方法的回调函数中,当然如果你想在js中获取文件,这样也行。
以上的方法来源于:http://my.oschina.net/u/2462382/blog/517135
但是这种方法经过试验以后发现,在百度浏览器可以实现文件下载,但是在火狐浏览器和谷歌浏览器发现浏览器就然没有反应.....于是又百度了一下,发现是少了一行代码,代码如下:
response.setHeader("Content-type", "application-download");
这行代码应该是告诉浏览器这个文件流需要进行下载(个人猜测),经过测试,QQ浏览器、谷歌浏览器、火狐浏览器都可以进行下载,完美解决。
问题2:url传参是中间带有中文参数,后台接收以后会出现乱码前台请求是,用的是window.location.href =url+参数;的方法,由于参数是中文,所以在后台获取到的数据出现了乱码,解决方法如下:
当你的传参是get传参数时
如果是有中文,如果你的传参形式是iso8859-1(默认是这个)
如果你页面显示是utf-8或gbk那么
取出参数时
可以这样转换:
String str = request.getParameter(参数);
str = new String(str.getBytes("iso8859-1"),'utf-8')//不一定是utf-8。看你页面显示用的编码
此方法参考于:http://bbs.csdn.net/topics/330229317
多谢以上作者的分享,如果有侵权等行为望告知。