前言
一直在数据库里面存的都是图片在服务器的地址, 然后再到浏览器中显示, 但是发现两个问题
第一: 为了安全起见, js 是无法读取本地的图片的, 不然你写一个 js, 岂不是可以获取任何人电脑里面的文件了
第二: 图片存在的是在服务器的硬盘上面, 而不是在客户的硬盘里面, 所以也是取不到的
后来在网上找方法, 找的方法, 都是各种转换二进制到 xml 中, 的各种高大上的答案, 然后本人又实在太懒了, 就自己想了一个方法, 就是利用 BufferedImage 这个类
开始
首先说说我的思路, 就是把本地的图片, 加载到内存中, 然后放到 BufferedImage 这个缓冲流中, 然后利用 ImageIO.write(), 这下大家都估计想得到一种思路了, 但是如果说 ajax, 得到的数据, 估计还是啥个乱七八糟的啥吧! 没关系, 稍后介绍
工具类
首先建立一个加载图片的工类具, 把一个图片的地址当参数存进去, 得到这个图片的缓冲流:
- /**
- * 根据图片的地址, 返回图片的缓冲流
- * @param addr
- * @return
- */
- public static BufferedImage getInputStream(String addr){
- try {
- String imgPath = addr;
- BufferedImage image = ImageIO.read(new FileInputStream(imgPath));
- return image;
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println();
- System.out.println("获取图片异常: java.awt.image.BufferedImage");
- System.out.println("请检查图片路径是否正确, 或者该地址是否为一个图片");
- }
- return null;
- }
没错, 就是使用 ImageIO.read, 来加载流对象, 然后就是处理类的代码了, 这是我用的是 springMVC,springMVC 这段时间比较火, 所以我也好少用 struts2 了
处理类
- /**
- * 根据图片的地址, 来获取图片
- * @param addr
- * @param response
- */
- @ResponseBody
- @RequestMapping("/getImg")
- public void getImg(@Param("addr")String addr,HttpServletResponse response){
- BufferedImage img = new BufferedImage(300, 150, BufferedImage.TYPE_INT_RGB);
- img = ImgUtil.getInputStream(addr);
- if(img==null){
- throw new RuntimeException("打印图片异常: com.controller.Business_Ctrl.getImg(String, HttpServletResponse)");
- }
- if(img!=null){
- try {
- ImageIO.write(img, "JPEG", response.getOutputStream());
- } catch (IOException e) {
- e.printStackTrace();
- System.out.println("打印异常: com.controller.Business_Ctrl.getImg(String, HttpServletResponse)");
- }
- }
- }
很明显, 使用 ImageIO.read() 读到图片时, 就用 ImageIO.write(), 输出图片, 输入流就是 HttpServletResponse.getOutputStream()
客户端
- function setImg(addr){
- $("#logo").attr("src","business/getImg?addr="+addr+"");
- }
如图所示, 当需要加载图片的时候, 就触发 setImg 方法, 给它一个地址, 当然, 地址, 早已经从后台传到前台了, 自然, 就算没有地址, 稍微变一下, 也可以在后台得到地址, 然后返回, 然后给 img 标签设置 src 属性, 就可以得到图片了
来源: http://www.bubuko.com/infodetail-2534931.html