文件下载

浏览器默认下载文件的方式为inline即能打开就打开,不能打开就下载。
通过给a标签href中的属性值赋值,可以完成对一些浏览器无法解析打开的文件进行下载。但是当要下载的文件浏览器能解析打开,要如何告诉浏览器进行下载此文件呢?

通知客户端浏览器: 这是一个需要下载的文件, 不能再按普通的 html 的方式打开.

1
2
//即设置一个响应的类型: application/x-msdownload
response.setContentType("application/x-msdownload");

通知客户端浏览器: 不再有浏览器来处理该文件, 而是交由用户自行处理
设置响应流中文件进行下载,attachment以附件形式下载,filename= 表示下载显示的下载文件名。

1
2
//设置用户处理的方式: 响应头: Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=abc.txt");

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.kylin.servlet;

import org.apache.commons.io.FileUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通知客户端浏览器: 这是一个需要下载的文件
resp.setContentType("application/x-msdownload");

//下载时文件显示的名字
String fileName = "文件下载.txt";

resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
OutputStream out = resp.getOutputStream();
//源文件地址
File txtFileName = new File("C:\\Data\\IDM\\Java学习\\尚硅谷Java\\3.JavaWeb阶段\\尚硅谷JavaWEB视频教程\\22. 尚硅谷_佟刚_JavaWEB_源代码\\fileUpload\\note.txt");

/* InputStream in = new FileInputStream(txtFileName);
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer))!=-1){
out.write(buffer,0,len);
}
in.close();*/
byte[] bytes = FileUtils.readFileToByteArray(txtFileName);//读取文件成一个二进制数组
out.write(bytes);
out.flush();
out.close();
}
}