码迷,mamicode.com
首页 > Web开发 > 详细

Web 下载图片为空

时间:2017-09-01 21:22:03      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:分享   read   inpu   str   写文件   路径   alt   last   技术分享   

问题描述:

文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载。但是下载任务正常进行,下载下来的图片却是空

技术分享

问题代码:

        //从服务器下载一张图片
        
        //创建字节读取流 从本地读取图片
        //获取图片路径
        ServletContext context = this.getServletContext();
        String path= context.getRealPath("WEB-INF/classes/德拉科.jpg");
        FileInputStream fis = new FileInputStream(path);
        
        //创建字节输出流 将图片发送给客户端
        ServletOutputStream sos = response.getOutputStream();
        //处理下载文件名称
        String fileName = path.substring(path.lastIndexOf("\\")+1);
        //处理文件名称中文乱码问题
        String name = URLEncoder.encode(fileName, "utf-8");
        //通知浏览器以下载的方式打开文件
        response.setHeader("content-disposition", "attachment;filename="+name);
        response.setHeader("content-type", "image/jpeg");
        
        //创建字符数组
        byte[] arr = new byte[1024];
        int len = 0;
        if((len = fis.read(arr)) != -1)
        {
            sos.write(arr, 0, len);
        }
        
        fis.close();
        sos.close();

问题分析:

首先,图片成功保存到本地,说明通过response设置header进行下载是可行的,那么,图片内容为空只能是读写时出现问题

仔细检查,发现在读写部分将while写成了if,导致,写文件只在第一次有效,之后无法写入

 问题解决:

将if改为while 
        //从服务器下载一张图片
        
        //创建字节读取流 从本地读取图片
        //获取图片路径
        ServletContext context = this.getServletContext();
        String path= context.getRealPath("WEB-INF/classes/德拉科.jpg");
        FileInputStream fis = new FileInputStream(path);
        
        //创建字节输出流 将图片发送给客户端
        ServletOutputStream sos = response.getOutputStream();
        //处理下载文件名称
        String fileName = path.substring(path.lastIndexOf("\\")+1);
        //处理文件名称中文乱码问题
        String name = URLEncoder.encode(fileName, "utf-8");
        //通知浏览器以下载的方式打开文件
        response.setHeader("content-disposition", "attachment;filename="+name);
        response.setHeader("content-type", "image/jpeg");
        
        //创建字符数组
        byte[] arr = new byte[1024];
        int len = 0;
        while((len = fis.read(arr)) != -1)
        {
            sos.write(arr, 0, len);
        }
        
        fis.close();
        sos.close();

技术分享

 问题总结:

      //处理下载文件名称
        String fileName = path.substring(path.lastIndexOf("\\")+1);
        //处理文件名称中文乱码问题
        String name = URLEncoder.encode(fileName, "utf-8");

//通知浏览器以下载的方式打开文件 response.setHeader("content-disposition", "attachment;filename="+name); response.setHeader("content-type", "image/jpeg");

src下文件的路径问题
  Web工程的根目录指的是WebRoot/WEB-INF/classes开始的。java的class文件只能读到这个目录的的文件。如果想读取其他地方的文件,可以用绝对路径
  如果是通过java的class读文件,比如“德拉科”.jpg,只能放到WebRoot/WEB-INF/classes目录下。也就是放到工程src下,会自动编译到WebRoot/WEB-INF/classes目录下的

 

参考链接:http://blog.csdn.net/zhangqindabendan/article/details/53002544

Web 下载图片为空

标签:分享   read   inpu   str   写文件   路径   alt   last   技术分享   

原文地址:http://www.cnblogs.com/roxy/p/7464967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!