java ee文件下载_JavaEE实现文件下载
我们先来看一个最简单的文件下载的例子:
package com.yyz.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//文件下载
public class ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/1.gif");
String filename = realpath.substring(realpath.lastIndexOf("
\\")+1);
response.setHeader("content-disposition", "attachment;filename="+filename);
//服务器通过这个头,告诉浏览器以下载方式打开数据
FileInputStream in = new FileInputStream(realpath);
int len = 0;
byte buffer[]=new byte[1024];
OutputStream out = response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
//out不用close,response在销毁的时候服务器会自动关闭与response相关的流。
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
该段代码的功能是从服务器端下载图片1.png。目录结构用MyEclipse的package explorer显示如下:
让我们增加一点难度,我们要下载的文件是一个中文名字的文件。由于在http协议中头文件中的东西只能是ASCII字符,因而通过上述方式(直接将 String realpath = this.getServletContext().getRealPath("/download/1.gif");改为 String realpath = this.getServletContext().getRealPath("/download/图片.gif");)直接拿文件,
会出现乱码问题。附上测试结果:
要解决这个问题,要用到 URLEncoder类的encode方法:
package com.yyz.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//中文文件下载时,中文文件名要经过URL编码。
public class ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/图片.gif");
String filename = realpath.substring(realpath.lastIndexOf("
\\")+1);
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//本函数将字符串以 URL 编码
FileInputStream in = new FileInputStream(realpath);
int len = 0;
byte buffer[]=new byte[1024];
OutputStream out = response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
附上测试结果:
另外这里有一个小细节需要大家注意:
不能用FileReader代替FileInputStream。用FileReader会丢失数据,原因是这样的:FileReader是字符流,而图片,媒体文件等的数据都是以01的方式存储,用FileReader读的时候需要查阅一个编码表,如果未指定一种编码,则使用相应平台的默认编码。如在中国的电脑就会去查GB2312。当读到GB2312码表中不存在的编码时,会将该数据编码成'?',结束后数据就变成中文和'?'的混合。发到客户端后显示时再次查阅码表,将所有的'?'替换成'?'的编码,就会丢失数据。向这种细节只需要记住一点:字节流可以处理任意类型的数据,字符流只能处理字符数据。
java ee文件下载_JavaEE实现文件下载相关推荐
- java ee 下载_javaee.jar下载-javaee.jar包下载 --pc6下载站
javaee.jar包是一个开发javaEE项目必备的包就目前而言所有能用的看的到的框架都是建立在JavaEE包之上如果没有JavaEE包将寸步难行马上下载javaee.jar吧.. 相关软件软件大小 ...
- java ee 中文_javaee中的中文乱码处理
浏览器正常显示 response.setContentType("text/html;charset='utf-8'") response.setCharacterEncoding ...
- java ee 组件_javaEE的核心API跟组件的关系
J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单 ...
- java ee考试题_Java-EE考试习题
如果缺少破土面出并与风雪拚搏的勇气,种子的前途并不比落叶美妙一分.以下是小编为大家搜索整理了Java_EE考试习题,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! 第一章 1. J ...
- java ee简介_JavaEE简介
1. 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程 ...
- java ee 容器_javaee中web的四大容器简介
在Servlet中,存在四种容器: (1)page-pageContext (2)request-HttpRequest (3)session-HttpSession (4)application-S ...
- java 导出表格打包zip文件下载_asyExcel导出excel并打包成zip压缩包下载
假期期间自己在家撸码,刚好用到了导出,导出来之后是多个文件,所以需要打成压缩包并下载来给客户.查阅了一些资料,把这段代码贴在这,相当于有个记录吧. package com.business.testE ...
- java ee学生管理系统_javaEE 学生基本信息管理系统
javaEE 学生基本信息管理系统 软 件 学 院课程设计报告书课程名称 Java EE 课程设计 设计题目 学生基本信息管理系统 专业班级 学 号 姓 名 指导教师 2011 年 12 月1 设计时 ...
- java ee是什么_javaee是什么?
Java EE是 J2EE的一个新的名称,之所以改名,目的还是让大家清楚J2EE只是Java企业应用.随着WEB和EJB容器概念诞生,使得软件应用业开始担心SUN的伙伴们是否还在Java平台上不断推出 ...
最新文章
- 吉林大学计算机维护与维修,吉林大学汽车维修工程考试知识点.doc
- 思科交换机Debug调试命令
- 当深度学习遇上量化交易——因子挖掘篇
- oj运行时错误_FME服务器链接运行时错误(由于缺少适当的权限,用户未授权的请求)...
- linux脚本自动修改网卡,Linux脚本程序自动修改网卡配置文件中的MAC地址
- laravel连接mysql8_php – 如何使用laravel运行MySql 8?
- spin_lock amp; mutex_lock的差别?
- 诛仙服务器状态查询,《诛仙2》3月19日服务器数据互通公告
- idea java调用python代码
- java 应用 中文字体_Linux 添加中文字体库,解决Java 生成中文水印不显示问题
- 炫酷收徒技术网络网站源码
- 数字签名原理及其应用详解
- win10系统word2019如何去掉文字背景颜色方法
- 腾讯云游戏多媒体解决方案
- 无人值守地磅称重系统方案的设计原理
- java数据结构与算法之顺序表与链表深入分析
- excel系列【统计一列中的不重复项】
- Illegal character in authority at index 18:
- C# .Net通过pythonnet调用python pyd文件
- Ionic开发入门教程_3
热门文章
- ioca0中断 pic单片机_关于PIC单片机的模块和功能总结
- js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?
- 安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】
- 织梦服务器系统win10,WIN服务器爆破DEDECMS后台目录
- matlab保存colormap失败
- 掌控谈话~重复对方的话
- mysql 64位 8.0.11_mysql8.0.11 在windows64安装 步骤
- linux多进程优先级,Linux多线程之优先级
- circlegan_CycleGAN原理以及代码全解析
- oracle获取序列并赋值,Oracle中序列的使用