java+web+批量下载文件
JavaWeb 文件下载功能
文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端。
1. 文件名 - 接受前端发来的文件名
获取到前端页面发送过来的要下载的文件的名字
String filenameValue = req.getParameter("filename");
2. ServletContext域 - 获取到ServletContext域对象
后面将调用此对象的一系列方法,用于获取文件路径、文件MimeType,并设置文件输出类型
ServletContext servletContext = req.getServletContext(); //获取到ServletContext域对象
3. 文件路径 - 获取指定文件在web项目中的路径
通过获取到ServletContext域对象的getRealPath()方法,读取download目录下文件的绝对路径
注意:download目录必须放在webContent目录下面,否则可能会找不到,导致报异常,在读取资源的时候,项目demo会直接去查找webContent下面的文件和文件夹
String realPath = servletContext.getRealPath("download/"+filenameValue); //获取到要下载文件在web项目中的绝对路径
4. 文件MimeType - 获取文件的MimeType类型
通过获取到的 ServletContext 域对象的 getMimeType() 方法,获取到文件MimeType
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。
MIME 协议指示 MIME 用户代理如何显示附加的文件。
MIME 参考手册:http://www.w3school.com.cn/media/media_mimeref.asp
告知浏览器文件的类型:response.setContentType(文件的MIME类型);
String mimeType = servletContext.getMimeType(filenameValue); //获取到要下载文件的mimeType类型
5. 输出类型 - 设置文件的输出类型
根据之前获取到的文件MimeType,然后通过 Response 域对象的 setContentType() 方法,设置文件的输出类型
resp.setContentType(mimeType); //设置文件的输出类型
6. 设置响应头 - 确定文件是内嵌或弹出下载框
通过 Response 域对象的 setHeader("Content-Disposition","attachment;filename="+filename) 方法设置响应头
Content-Disposition(内容处置/处理)
是 MIME 协议的扩展,Content-Disposition 可以控制用户请求所得的内容存为一个文件时提供一个默认的文件名
inline 和 attachment:文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
inline 表示:内嵌显示,文本和图片都可以解析,但对于文件或者视频会自动去调用成attachment,因此可以直接使用inline
attachment:弹出下载框,因为attachment是让文件以附件的形式打开,因此会调用下载,但此下载的功能并没有提示
//设置输出(下载)的文件的默认文件名为filenameValue的值,inline表示内嵌文本和图片,文件和视频会自动调用成attachment
resp.setHeader("Content-Disposition", "inline;filename="+filenameValue);
7. 执行输出(下载) - IO流
7.1 通过 new,创建字节输入流 FileInputStream,读取文件
7.2 通过Response域,创建Servlet的输出流,输出文件
FileInputStream fileInputStream = new FileInputStream(realPath);
ServletOutputStream outputStream = resp.getOutputStream();
int b=0;
byte[] by = new byte[1024*8];
while ((b=fileInputStream.read(by))!=-1) {
outputStream.write(by, 0, b);
}
outputStream.flush();
fileInputStream.close();
outputStream.close(); //关流,response获得流会自动关闭,因此也可以不用手动关
功能实现代码
Java 代码 - /demo/src/com/Download.java
package com;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Download extends HttpServlet{
@Override
public void init(ServletConfig config) throws ServletException {
/**重写了Servlet的init(ServletConfig config)方法后一定要记得调用父类的init方法,
* 否则在service/doGet/doPost方法中使用getServletContext()方法获取ServletContext对象时
* 就会出现java.lang.NullPointerException异常
* */
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**1. 接受前端页面发送过来的文件名字
* 获取到前端页面发送过来的要下载的文件的名字
* */
String filenameValue = req.getParameter("filename");
//---------------------
// filenameValue = URLEncoder.encode(filenameValue, "gbk");
/**2. 获取到ServletContext域对象
* 后面将调用此对象的一系列方法,用于获取文件路径、文件MimeType、文件输出类型
* */
ServletContext servletContext = req.getServletContext(); //获取到ServletContext域对象
/**3. 获取指定文件在web项目中的路径
* 通过获取到ServletContext域对象的getRealPath()方法,读取download目录下文件的绝对路径
* download目录必须放在webContent目录下面,否则可能会找不到,导致报异常,
* 在读取资源的时候,项目demo会直接去查找webContent下面的文件和文件夹
* */
String realPath = servletContext.getRealPath("download/"+filenameValue); //获取到要下载文件在web项目中的绝对路径
/**4. 获取到文件MimeType
* 通过获取到的ServletContext域对象的getMimeType()方法,获取到文件MimeType
* MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。
* MIME 协议指示 MIME 用户代理如何显示附加的文件。
* MIME 参考手册:http://www.w3school.com.cn/media/media_mimeref.asp
* */
String mimeType = servletContext.getMimeType(filenameValue); //获取到要下载文件的mimeType类型
/**5. 设置文件的输出类型
* Response域对象的setContentType()方法,设置文件的输出类型
* */
resp.setContentType(mimeType); //设置文件的输出类型
/**6. 设置响应头,确定文件是内嵌或弹出下载框
* 通过 Response 域对象的 setHeader("Content-Disposition","attachment;filename="+filename) 方法设置响应头,
* Content-Disposition(内容处置/处理) :
* 是 MIME 协议的扩展,Content-Disposition 可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,
* inline 和 attachment :
* 文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
* inline 表示:内嵌显示,文本和图片都可以解析,但对于文件或者视频会自动去调用成attachment,因此可以直接使用inline
* attachment:弹出下载框
* URLEncoder 对象,将在响应回去的头,里面所代码filename的编码格式,转换为与客户端的一致的编码格式
* URLEncoder.encode(filenameValue,"utf-8"); 将Response响应到浏览器客户端为filenameValue的文件名,转变为utf-8的编码格式
*/
resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filenameValue,"utf-8")); //设置输出(下载)的文件的默认文件名为filenameValue的值,inline表示内嵌文本和图片
/**7. 输出文件(下载文件)
* 7.1 通过 new,创建字节输入流 FileInputStream,读取文件
* 7.2 通过Response域,创建Servlet的输出流,输出文件
* */
FileInputStream fileInputStream = new FileInputStream(realPath);
ServletOutputStream outputStream = resp.getOutputStream();
int b=0;
byte[] by = new byte[1024*8];
while ((b=fileInputStream.read(by))!=-1) {
outputStream.write(by, 0, b);
}
outputStream.flush();
fileInputStream.close();
outputStream.close(); //关流,response获得流会自动关闭,因此也可以不用手动关
}
}
前端页面 jsp 代码 - /demo/WebContent/download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<!-- <base> 标签为页面上的所有链接规定默认地址或默认目标。 -->
<base href="<%=basePath%>">
<meta charset="UTF-8">
<title>文件下载</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<a href="download?filename=JDBC连接主流数据库.txt">点击下载 文件</a> <br/>
<a href="download?filename=0413102708.avi">点击下载 视频</a>
</body>
</html>
web.xml - /demo/WebContent/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>demo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>ServletContextName</param-name>
<param-value>ServletContextValue</param-value>
</context-param>
<servlet>
<servlet-name>Download</servlet-name>
<servlet-class>com.Download</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
</web-app>
下载文件出现中文乱码和不显示文件名的情况
在有些情况下,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,原因是不同的浏览器默认对下载文件的编码方式不同,比如ie是UTF-8编码方式,而火狐浏览器是Base64编码方式。
/**URLEncoder 对象,将在响应回去的头,里面所代码filename的编码格式,转换为与客户端的一致的编码格式
* URLEncoder.encode(filenameValue,"utf-8");
* 将Response响应到浏览器客户端为filenameValue的文件名,转变为utf-8的编码格式
* */
resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filenameValue,"utf-8"));
详细配置信息可以参考这篇文章:http://blog.ncmem.com/wordpress/2019/08/28/java%e6%89%b9%e9%87%8f%e4%b8%8b%e8%bd%bd/
java+web+批量下载文件的更多相关文章
- web批量下载文件到本地
JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...
- Java Web之下载文件
下载的文件,不能随便的被访问,放在外面的文件夹肯定不行,url一敲就能访问了,所以我们要放在WEB-INF文件夹里面,WEB-INF文件夹只有Servlet才能访问,我们新建一个文件夹,叫downlo ...
- java多线程批量下载文件
多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...
- C#使用ICSharpCode.SharpZipLib压缩后进行web批量下载文件
参考:http://blog.csdn.net/kongwei521/article/details/51167903#
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩
现在需要从oss上面批量下载文件并压缩打包,搜了很多相关博客,均是缺胳膊少腿,要么是和官网说法不一,要么就压缩包工具类不给出 官方API https://help.aliyun.com/documen ...
- Java批量下载文件并zip打包
客户需求:列表勾选需要的信息,点击批量下载文件的功能.这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成zip压缩文件,然后使用浏览器的下载功能即可完成批量下载的需求.以下是zi ...
- 批量下载文件web
最近需要这个所以写了一个例子一般批量下载由以下步骤组成: 1.确定下载的源文件位置 2.对文件进行打包成临时文件,这里会用到递归调用,需要的嵌套的文件夹进行处理,并返回文件保存位置 3.将打包好的文件 ...
随机推荐
- 【VS开发】VS2013多字节工程问题uilding an MFC project for a non-Unicode character set is deprecated
VS2013多字节工程问题 使用VS2013编译旧版VC++程序时,提示Building an MFC project for a non-Unicode character set is depre ...
- netcore 实现一个简单的Grpc 服务端和客户端
参考资料,和详细背景不做赘述. 首先定义prop 文件 syntax ="proto3"; package RouteGrpc; service HelloWorld{ rpc S ...
- for循环练习题:拆解字符并输入下标
test = input('请输入:') for item in range(0,len(test)): print(item,test[item])
- 爬取网易云音乐评论!python 爬虫入门实战(六)selenium 入门!
说到爬虫,第一时间可能就会想到网易云音乐的评论.网易云音乐评论里藏了许多宝藏,那么让我们一起学习如何用 python 挖宝藏吧! 既然是宝藏,肯定是用要用钥匙加密的.打开 Chrome 分析 Head ...
- 普通帐号起redis
wget http://download.redis.io/releases/redis-4.0.11.tar.gz $ tar xzf redis-4.0.11.tar.gzmv redis-4.0 ...
- laravel5.5学习2-路由系统
一.初识路由 路由系统是所有 PHP 框架的核心,路由承载的是 URL 到代码片段的映射,不同的框架所附带的路由系统是这个框架本质最真实的写照,一丝不挂,一览无余.Laravel 路由中文文档:htt ...
- Android热修复、插件化、组件化
模块化:项目按照独立的模块进行划分 组件化:将项目按照单一的组件来进行划分结构 项目组件化的重要环节在于,将项目按照模块来进行拆分,拆分成一个个业务module和其他支撑module(lib),各个业 ...
- 使用python的kazoo模块连接zookeeper实现最基本的增删改查
kazoo的官方文档地址:https://kazoo.readthedocs.io/en/latest/index.html #!/usr/bin/env python # -*- coding: u ...
- Ajax轮询请求
Ajax轮询请求 什么是轮询? 轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. Ajax轮询需要服务器有很快的处理速度与快速响应. ...
- kali 下安装 vmtools
网上的教程都是默认路径下的,kali是定制版本的,路径不同,所以首先要找到media下安装包的路径,然后进入该路下,将安装包复制到想要的路径下,并解压缩到想要的路径下,剩下的就跟网上的差不多了,即找到 ...