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

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. mysql 中的事务
  2. 虚拟机硬盘启动计算机后黑屏,高手亲自教告诉你win7虚拟机启动后黑屏的操作方案...
  3. android文本与布局
  4. type python django models_Django 模型
  5. React 源码剖析系列 - 不可思议的 react diff
  6. 微信小程序遇到的那些坑
  7. iOS 最新App提交上架流程及部分问题的解决方案2016.12.21,感谢原博主!!!
  8. 2014 - 2015
  9. markdown 书写代码
  10. 计算机类专业用五笔输入法,专业英文拼音五笔打字训练
  11. windows下安装ruby(一)
  12. 转载-PCB板加工流程
  13. C# 实现像QQ一样隐藏窗体
  14. 对于预防降权有什么手段?
  15. 软件控制硬件c语言编程,硬件编程用什么软件好
  16. nginx配置日志记录问题
  17. UI设计师支招,简单几步让您PPT更好看
  18. mybatis报错SQLException、syntax error、expect IDENTIFIER, actual IDENTIFIER pos
  19. 一个demo让你彻底搞懂观察者模式
  20. CN3302-锂电池充电管理-上海如韵电子有限公司

热门文章

  1. (Matlab函数详解)机器学习中的4种分类算法(LDA、QDA、SVM、KNN)
  2. matlab——图像细化
  3. 数据预测之BP神经网络具体应用以及matlab实现
  4. Smarty模板技术学习
  5. Python3.2+ 的 concurrent.futures 模块,利用 multiprocessing 实现高并发。
  6. Linux 输入输出重定向 2>/dev/null和>/dev/null 2>1和2>1>/dev/nul
  7. CompletableFuture详解~thenApply
  8. Java并发编程实战~Immutability模式
  9. Guava入门~Lists
  10. C++学习之路 | PTA乙级—— 1020 月饼 (25分)(精简)