问题描述:
文件下载功能是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下文件的路径问题
参考链接:http://blog.csdn.net/zhangqindabendan/article/details/53002544