web项目通过IO流读图片遇到错

之前写的用IO流给前端读取图片,本地测试、刚上linux时都没问题,过了几天读不出来了,神奇,但是另一个老大哥写的却一直没问题,问了一个大神,说可能是jdk版本问题,本机用的是sun的,linux环境用的是IBM的,姑且认为是这样吧
我的写法:

@RequestMapping(value = "getImage", method = RequestMethod.GET)
    public void getImage(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
        logger.info("getImage param:" + fileName);
        if(fileName == null || "".equals(fileName)) {
            throw new ServiceException("参数不正确!");
        }
        String imgFile = imagesPath + "/" +fileName;
        String imgType = fileName.substring(fileName.indexOf('.') + 1 , fileName.length());
        response.setDateHeader("Expires", 0);  
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");  
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");  
        response.setHeader("Pragma", "no-cache");  

        response.setContentType("image/"+imgType); 

        BufferedImage bi = null;
        ServletOutputStream out = response.getOutputStream();

        try {
            bi = ImageIO.read(new File(imgFile));
            ImageIO.write(bi, imgType, out);  
        } catch (IIOException e) {
            logger.error("读取不出图片:"+imgFile, e);
            bi = StringHelper.getCrystalImage(1, 1);
            ImageIO.write(bi, "png", out);
        } finally {
            try {  
                out.flush();
            } finally {  
                out.close();  
            }  
        }
    }

正确无误的写法

@RequestMapping(value = "/getImage", method = RequestMethod.GET)
    public void getImage(HttpServletResponse response,String fileName){

        if(!StringUtils.hasText(fileName)){
            return;
        }

        fileName = fileName.trim();

        if(fileName.length()<9){
            return;
        }

        File file = new File(portalnewsPath,fileName);

        if(!file.exists()){
            return;
        }

        ServletOutputStream sos = null;

        InputStream is = null;

        try {
            sos = response.getOutputStream();
            is = new FileInputStream(file);
            sos.write(IOUtils.toByteArray(is));
        } catch (Exception e) {
            logger.error("渲染图片出错", e);
        } finally {

            if (is != null) {
                try {
                    is.close();
                } catch (Exception e) {
                    logger.error("关闭图片读取流出错", e);
                } finally {
                    is = null;
                }
            }

            if (sos != null) {
                try {
                    sos.close();
                } catch (Exception e) {
                    logger.error("关闭响应输出流出错", e);
                } finally {
                    sos = null;
                }
            }
        }

    }

由此可见,往往越原始的写法越可靠

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值