在网站上以二进制流的方式显示本地图片

在项目中显示本地文件有多种方式,这里讲一种通过二进制流显示本地图片的方式

(最近发现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();
				}
			}
		}

	}



展开阅读全文

没有更多推荐了,返回首页