在项目中显示本地文件有多种方式,这里讲一种通过二进制流显示本地图片的方式
(最近发现get请求参数中包含“\”符号,可能会报400参数异常,导致不能执行后台代码)
解决办法:因为上传图片的时候用到的是File.seperater,在window中保存的是“\”,在linux中保存的是“/”,所以,我在window中保存到数据库的时候把“\”替换成“/”,来解决这个问题
例如这个例子,在后台控制器写一个showImage的接口
/**
* 显示图片
* @param response
* @param request
* @return
*/
@RequestMapping(value = "/showImage")
public void showImage(String fileName,HttpServletRequest request, HttpServletResponse response) {
//如果本地图片存储位置在"c:"盘,路径为"c:"+/+fileName
String filePath=PortalCxt.getParamValue(PortalCons.UPLOAD_URL_KEY)+File.separator+fileName;
FileOperation.downloadFile(request, response, filePath, fileName);
}
在FileOperation类中有一个方法把存在于本地的这张图片转换为二进制流,下载到网页上
public static void downloadFile(final HttpServletRequest request,final HttpServletResponse response, String filePath, String fileName) {
OutputStream outputStream = null;
try {
byte[] data = toByteArray(filePath);
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { //解决IE和火狐文件名兼容的问题
fileName=new String( fileName.getBytes("utf-8"),"ISO-8859-1");//解决中文乱码
} else {
fileName=URLEncoder.encode( fileName,"UTF-8");;
}
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream;charset=UTF-8");
outputStream = new BufferedOutputStream(response.getOutputStream());
outputStream.write(data);
outputStream.flush();
response.flushBuffer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}