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");
参考链接:http://blog.csdn.net/zhangqindabendan/article/details/53002544
Web 下载图片为空的更多相关文章
- 第三百二十五节,web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
第三百二十五节,web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签 标签选择器对象 HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象需 ...
- Unity3D教程宝典之Web服务器篇:(第二讲)从服务器下载图片
转载自风宇冲Unity3D教程学院 从Web服务器下载图片 上一讲风宇冲介绍了wamp服务器及安装.这回介绍如何从服务器下载内容至 ...
- 用python批量下载图片
一 写爬虫注意事项 网络上有不少有用的资源, 如果需要合理的用爬虫去爬取资源是合法的,但是注意不要越界,前一阶段有个公司因为一个程序员写了个爬虫,导致公司200多个人被抓,所以先进入正题之前了解下什么 ...
- C++根据图片url下载图片
需要使用到URLDownloadToFile()函数,该函数在头文件<urlmon.h>中声明. URLDownloadToFile()函数的定义如下: HRESULT URLDownlo ...
- tableView异步下载图片/SDWebImage图片缓存原理
问题说明:假设tableView的每个cell上的imageView的image都是从网络上获取的数据.如何解决图片延迟加载(显示很慢).程序卡顿.图片错误显示.图片跳动的问题. 需要解决的问题: 1 ...
- 用java页面下载图片
try { //根据String形式创建一个URL对象 String filePath = materialProductWorks.getDownloadImageUrl(); URL url = ...
- 【转】java URLConnection从网上下载图片或音乐
try { //根据String形式创建一个URL对象, URL url = new URL("http://www.baidu.com"); //实列一个URLconne ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- 移动web:图片切换(焦点图)
在web页面上图片切换(焦点图)效果实在是太常见了,PC端.移动端到处都有它的身影. 上次写了个tab选项卡的效果,在这里延续一下,改成图片切换的效果. 如果不需要自动播放,稍微修改下html标签.和 ...
随机推荐
- mysql-connector-java-3.1.10-bin-g.jar 和 mysql-connector-java-3.1.10-bin.jar两个文件有什么不同呀?
MySQL Connector/J的文档里说: MySQL Connector/J is distributed as a .zip or .tar.gz archive containing the ...
- ZEDGRAPH画图心得,SQL语句构造!!!
/// <summary> /// 画折线 /// </summary> public void Drawline() { OleDbConnection odcConnect ...
- echarts折线图柱状图的坐标轴的颜色及样式的设置
基本用法请查看echarts官网. 一.图例legend的设置. 1.字体和颜色的设置 textStyle:{ fontSize:15, color:'#fff' } 2.样式的设置 legend: ...
- RabbitMQ在windows下的安装
RabbitMQ 它依赖于Erlang,需要先安装Erlang.首先确定你的window电脑是32位还是64位,以下的安装以window 64位电脑举例. 运行行Erlang/OTP(otp_wi ...
- 大龄码农那些事——也谈996.ICU
1.背景 近期Github突然有一个开源项目火了,叫“996.icu”,开源地址:https://github.com/996icu/996.ICU ,目前star的人数截止我写这篇博文时已经高达17 ...
- SW4STM32 全局宏定义
/************************************************************************************ * SW4STM32 全局宏 ...
- TypeScript 编译器源码研究(一)
TypeScript (以下简称 TS)是一个非常强大的语言,其编译器源码超过 10000 行. 源码在 Github 可以找到:https://github.com/Microsoft/TypeSc ...
- .net core grpc 实现通信(一)
现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/)是google发布的一个开源.高性能.通用RPC(R ...
- (2)socket的基础使用(基于TCP协议)
socket()模块函数用法 基于TCP协议的套接字程序 netstart -an | findstr 8080 #查看所有TCP和UDP协议的状态,用findstr进行过滤监听8080端口 服务端套 ...
- 如何查看Eclipse的数字版的版本(转)
为什么叫数字版的版本,因为Eclipse软件里显示的是文字版的版本,比如我现在的就是Version: Indigo Release.这在下载插件的时候很不方便. 如何查看文字版的版本信息:打开Ecli ...