文件的下载
Posted 名字真的很急用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件的下载相关的知识,希望对你有一定的参考价值。
- 超链接的文件下载:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图片的下载</title>
</head>
<body>
<h1>超链接的文件下载</h1>
<a href="imags/01.jpg">下载文件01</a>
<br>
<a href="imags/02.jpg">下载文件02</a>
</body>
</html>
超链接文件下载,下载的图片默认是在浏览器显示。
http://localhost:8080/imags/01.jpg
该请求地址是一个资源,是无法处理请求的,为什么下载的图片会在浏览器显示呢?
在Tomcat的conf目录下的web.xml文件中配置了DefaultServlet会在服务器启动的时候自动创建。如果请求资源没有对应的servlet,服务器就会根据默认的DefaultServlet来进行处理。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
DefaultServlet会使用字节输入流读取文件(image/…)生成对应的输入流对象,然后使用字节输出流将输入流的字节流数据写到浏览器。
- 自定义servlet实现文件的下载
<h1>自定义servlet文件下载</h1>
<a href="download?filename=01.jpg">下载文件01</a>
<br>
<a href="download?filename=02.jpg">下载文件02</a>
</body>
</html>
@WebServlet("/download")
public class downServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = req.getParameter("filename");
String mimeType = getServletContext().getMimeType(filename);
System.out.println("文件下载的类型"+mimeType);
resp.setHeader("Content-Type",mimeType);
//解决中文乱码
String encode = URLEncoder.encode(filename, "UTF-8");
//设置响应头告诉浏览器下载文件而不是显示文件
resp.setHeader("Content-Disposition","attachment;filename="+encode);
String file ="imags/"+filename;
InputStream resourceAsStream = getServletContext().getResourceAsStream(file);
ServletOutputStream outputStream = resp.getOutputStream();
byte[] bytes = new byte[1024];
int length=0;
while((length=resourceAsStream.read(bytes))!=-1){
outputStream.write(bytes,0,length);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 使用框架common-io的实现
首先需要下载依赖。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
在我们没有使用框架的时候:
byte[] bytes = new byte[1024];
int length=0;
while((length=resourceAsStream.read(bytes))!=-1){
outputStream.write(bytes,0,length);
在我们使用了框架后只需要写:
IOUtils(inputStream,outputStream);
大大简化了我们的代码。
在我们后续的学习阶段要转变思想:有现成的框架尽量使用现成的框架,现阶段不要重复发明轮子,而是熟练的掌握一些开源框架的使用。
以上是关于文件的下载的主要内容,如果未能解决你的问题,请参考以下文章