我们先来看一个最简单的文件下载的例子:

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实现文件下载相关推荐

  1. java ee 下载_javaee.jar下载-javaee.jar包下载 --pc6下载站

    javaee.jar包是一个开发javaEE项目必备的包就目前而言所有能用的看的到的框架都是建立在JavaEE包之上如果没有JavaEE包将寸步难行马上下载javaee.jar吧.. 相关软件软件大小 ...

  2. java ee 中文_javaee中的中文乱码处理

    浏览器正常显示 response.setContentType("text/html;charset='utf-8'") response.setCharacterEncoding ...

  3. java ee 组件_javaEE的核心API跟组件的关系

    J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单 ...

  4. java ee考试题_Java-EE考试习题

    如果缺少破土面出并与风雪拚搏的勇气,种子的前途并不比落叶美妙一分.以下是小编为大家搜索整理了Java_EE考试习题,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! 第一章 1. J ...

  5. java ee简介_JavaEE简介

    1.  为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程 ...

  6. java ee 容器_javaee中web的四大容器简介

    在Servlet中,存在四种容器: (1)page-pageContext (2)request-HttpRequest (3)session-HttpSession (4)application-S ...

  7. java 导出表格打包zip文件下载_asyExcel导出excel并打包成zip压缩包下载

    假期期间自己在家撸码,刚好用到了导出,导出来之后是多个文件,所以需要打成压缩包并下载来给客户.查阅了一些资料,把这段代码贴在这,相当于有个记录吧. package com.business.testE ...

  8. java ee学生管理系统_javaEE 学生基本信息管理系统

    javaEE 学生基本信息管理系统 软 件 学 院课程设计报告书课程名称 Java EE 课程设计 设计题目 学生基本信息管理系统 专业班级 学 号 姓 名 指导教师 2011 年 12 月1 设计时 ...

  9. java ee是什么_javaee是什么?

    Java EE是 J2EE的一个新的名称,之所以改名,目的还是让大家清楚J2EE只是Java企业应用.随着WEB和EJB容器概念诞生,使得软件应用业开始担心SUN的伙伴们是否还在Java平台上不断推出 ...

最新文章

  1. 吉林大学计算机维护与维修,吉林大学汽车维修工程考试知识点.doc
  2. 思科交换机Debug调试命令
  3. 当深度学习遇上量化交易——因子挖掘篇
  4. oj运行时错误_FME服务器链接运行时错误(由于缺少适当的权限,用户未授权的请求)...
  5. linux脚本自动修改网卡,Linux脚本程序自动修改网卡配置文件中的MAC地址
  6. laravel连接mysql8_php – 如何使用laravel运行MySql 8?
  7. spin_lock amp; mutex_lock的差别?
  8. 诛仙服务器状态查询,《诛仙2》3月19日服务器数据互通公告
  9. idea java调用python代码
  10. java 应用 中文字体_Linux 添加中文字体库,解决Java 生成中文水印不显示问题
  11. 炫酷收徒技术网络网站源码
  12. 数字签名原理及其应用详解
  13. win10系统word2019如何去掉文字背景颜色方法
  14. 腾讯云游戏多媒体解决方案
  15. 无人值守地磅称重系统方案的设计原理
  16. java数据结构与算法之顺序表与链表深入分析
  17. excel系列【统计一列中的不重复项】
  18. Illegal character in authority at index 18:
  19. C# .Net通过pythonnet调用python pyd文件
  20. Ionic开发入门教程_3

热门文章

  1. ioca0中断 pic单片机_关于PIC单片机的模块和功能总结
  2. js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?
  3. 安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】
  4. 织梦服务器系统win10,WIN服务器爆破DEDECMS后台目录
  5. matlab保存colormap失败
  6. 掌控谈话~重复对方的话
  7. mysql 64位 8.0.11_mysql8.0.11 在windows64安装 步骤
  8. linux多进程优先级,Linux多线程之优先级
  9. circlegan_CycleGAN原理以及代码全解析
  10. oracle获取序列并赋值,Oracle中序列的使用