1.目的
如果简单的预览,会暴露文件的具体位置,可能是地址栏里,或者js代码里(打开调试工具就能看到)。 这时候用文件流,文件地址就不会被别人看到了
2.前台
当加载到这个标签的时候, 自动跳转到controller
<img id="picture" src= "<%=request.getContextPath()%>/preview/getFileStream" style=" vertical-align: middle; text-align: center;" />
如果你使用的是IE浏览器,那么这个请求是有问题的
每次请求的URL都是 preview/getFileStream, IE浏览器会给你从缓存里拿东西。
所以每次预览的内容都是一样的。
解决方法:
1. 设置自己的IE,每次打开页面不加载缓存
一个人还好, 很多人的话,这个不太实际
2. 在请求的URL中加一个参数 Math.random()
这样每次请求的URL都不一样, 你的Controller拼接一下就行了,避免404错误
3.controller代码
@RequestMapping(value = "/getFileStream", method = RequestMethod.GET)
public void pdfStreamHandler(HttpServletRequest request, HttpServletResponse response) {
String fileSrc=(String) request.getSession().getAttribute("fileSrc");
File file = new File(fileSrc);
try {
byte[] data = null;
try {
String strUrl = fileSrc.trim();
URL url=new URL(strUrl);
//打开请求连接
URLConnection connection = url.openConnection();
HttpURLConnection httpURLConnection=(HttpURLConnection) connection;
httpURLConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
// 取得输入流,并使用Reader读取
int responseCode=((HttpURLConnection) connection).getResponseCode();
BufferedInputStream bis=null;
bis = new BufferedInputStream(httpURLConnection.getInputStream());
ServletOutputStream sos = response.getOutputStream();
//BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
int b;
while((b = bis.read())!=-1) {
sos.write(b);
}
sos.close();
bis.close();
} catch (Exception e) {
}
}
catch (Exception e) {
return;
}
}
1.URL
URL(String src)
将src字符串 转为一个URL对象
2. URL.openConnection()
返回一个URLConnection实例, 表示URL引用的 远程对象的URL , 这里是远程服务器上的文件
3.HttpURLConnection
我只想获得一个响应码,判断这个文件是否存在 (有更优化的方法,这里不加具体详解)
把connection转换成HttpURLConnection
4.BufferedInputStream
缓冲流 ,这里不是读普通文本,所以不适用FileReader这个函数
BufferedInputStream(InputStream in)
创建一个BufferedInputStream对象, 保存参数in ,供以后使用
6.response