下载

1. 下载就是向客户端响应字节数据!

原来我们响应的都是html的字符数据!

把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!!

2. 下载的要求

* 两个头一个流!

> Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg

* 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!

> Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx

* 在filename=后面跟随的是显示在下载框中的文件名称!

> 流:要下载的文件数据!

* 自己new一个输入流即可!

---------------------------

下载的细节

1. 显示在下载框中的中文名称时,会出现乱码。

* FireFox:Base64编码。

* 其他大部分浏览器:URL编码。

通用方案:filename = new String(filename.getBytes("GBK"), "ISO-8859-1");

public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {

String agent = request.getHeader("User-Agent"); //获取浏览器

if (agent.contains("Firefox")) {

BASE64Encoder base64Encoder = new BASE64Encoder();

filename = "=?utf-8?B?"

+ base64Encoder.encode(filename.getBytes("utf-8"))

+ "?=";

} else if(agent.contains("MSIE")) {

filename = URLEncoder.encode(filename, "utf-8");

} else {

filename = URLEncoder.encode(filename, "utf-8");

}

return filename;

}

---------------------------

---------------------------

源代码:::

public class Download1Servlet extends HttpServlet {

@Override

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

/*

* 两个头一个流

* 1. Content-Type

* 2. Content-Disposition

* 3. 流:下载文件的数据

*/

String filename = "E:/Singre.mp3";

// 为了使下载框中显示中文文件名称不出乱码!

// String framename = new String("流光%飞舞.mp3".getBytes("GBK"), "ISO-8859-1");

String framename = filenameEncoding("Singre.mp3", req);

String contentType = this.getServletContext()

.getMimeType(filename);//通过文件名称获取MIME类型

String contentDisposition = "attachment;filename=" + framename;

// 一个流

FileInputStream input = new FileInputStream(filename);

//设置头

resp.setHeader("Content-Type", contentType);

resp.setHeader("Content-Disposition", contentDisposition);

// 获取绑定了响应端的流

ServletOutputStream output = resp.getOutputStream();

//commons-io-1.4.jar中的IOUtils

IOUtils.copy(input, output);//把输入流中的数据写入到输出流中。---输出流的节点就是客户端

input.close();

}

// 用来对下载的文件名称进行编码的!

public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {

String agent = request.getHeader("User-Agent"); //获取浏览器

if (agent.contains("Firefox")) {

BASE64Encoder base64Encoder = new BASE64Encoder();

filename = "=?utf-8?B?"

+ base64Encoder.encode(filename.getBytes("utf-8"))

+ "?=";

} else if(agent.contains("MSIE")) {

filename = URLEncoder.encode(filename, "utf-8");

} else {

filename = URLEncoder.encode(filename, "utf-8");

}

return filename;

}

}

jsp+servlet实现文件下载的更多相关文章

  1. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  2. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  3. JS.中文乱码,Jsp\Servlet端的解决办法

    JS.中文乱码,Jsp\Servlet端的解决办法 2010-03-08 15:18:21|  分类: Extjs |  标签:encodeuricomponent  乱码  urldecoder   ...

  4. 最简单的jsp+servlet的增删改查代码

    package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...

  5. JSP+Servlet中使用jspsmartupload.jar进行图片上传下载

    JSP+Servlet中使用cos.jar进行图片上传 upload.jsp <form action="FileServlet" method="post&quo ...

  6. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  7. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  8. JSP+Servlet+javabean+oracle实现页面多条件模糊查询

    之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...

  9. JSP+Servlet+javabean+mysql实现页面多条件模糊查询

    需求: 一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法: 需要实现的界面原型:要满足条件: 1.单选分类,点GO按扭 2.单独输入标 ...

随机推荐

  1. 【转】如何只用CSS做到完全居中

    英文原版链接:http://codepen.io/shshaw/full/gEiDt 我们都知道 margin:0 auto; 的样式能让元素水平居中,而 margin: auto; 却不能做到垂直居 ...

  2. HDU 2561 第二小整数(排序,水)

    第二小整数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. hihocoder Popular Products(STL)

    Popular Products 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N lists of customer purchase, your tas ...

  4. 02、Mecanim之IK动画

    序言:IK动画全名是Inverse Kinematics 意思是逆向动力学,就是子骨骼节点带动父骨骼节点运动. 比如体操运动员,只靠手来带动身体各个部位的移动.手就是子骨骼,身体就是它的父骨骼,这时运 ...

  5. RPD Volume 168 Issue 4 March 2016 评论3

    Design and fabrication of a multipurpose thyroid phantom for medical dosimetry and calibration   Abs ...

  6. 【树状数组】【枚举约数】 - Ambitious Experiment

    给定一个序列,支持以下操作: 对区间[l,r]的每个i,将1i,2i,3i,...这些位置的数都加d. 询问某个位置的数的值. 如果把修改看作对区间[l,r]的每个数+d,那么询问x位置上的数时,显然 ...

  7. Exercise03_03

    import java.util.Scanner; public class LinearEquation { public static void main(String[] args){ doub ...

  8. 上传--下载HDFS文件并指定文件物理块的大小

    使用hdfs的api接口分别实现从本地上传文件到集群和从集群下载文件到本地. 1)上传文件主要是使用FileSystem类的copyFromLocalFile()方法来实现,另外我们上传文件时可以指定 ...

  9. Android 架构 1.架构

    项目分为了四个层级:模型层.接口层.核心层.界面层.模型层定义了所有的模型:接口层封装了服务器提供的API:核心层处理所有业务逻辑:界面层就处理界面的展示.几个层级之间的关系如下图所示: 层级关系:模 ...

  10. Error: Top-level design entity "demo" is undefined

    原因:顶层模块的module名没有和工程名同名 解决方法:把顶层模块 module名改成和工程名同名 最近在玩QUARTUS 11遇到此问题! 问题补充:本人用的时VERILOG HDL硬件描述语言! ...