zoukankan      html  css  js  c++  java
  • Web 下载图片为空

    问题描述:

    文件下载功能是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

  • 相关阅读:
    rem适配布局(rem+less+媒体查询 和 rem+flexible.js)
    flex布局(弹性布局)
    移动端技术选型
    移动端(视口(meta),像素比,二倍图(图片,背景图,精灵图),css初始化(normalize.css),特殊样式,常见屏幕尺寸)
    案例-3D旋转木马
    CSS新特性(3D转换,perspective(透视),transfrom-style(子元素是否开启三维环境))
    css3 新特性(动画)
    案例-2D会旋转的盒子(rotate), 会缩放的盒子(scale),动画(animation)
    listener启动与关闭
    Oracle在Linux内核参数的修改
  • 原文地址:https://www.cnblogs.com/roxy/p/7464967.html
Copyright © 2011-2022 走看看