文件的上传和下载

文件上传

文件上传的要求:
1、要有一个form标签,method=post
2、form标签的encType属性值必须为multipart/form-data(表示提交的数据以多段进行拼接(每个表单项分为一段),然后以二进制流的形式提交给服务器)
3、在form标签中使用 input type=file 添加上传的文件
4、编写服务器代码接收,处理上传的数据

导入两个第三方的jar包:

处理文件上传的servlet程序:

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
package servlet;

public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("文件上传过来了");
// 1.先判断上传的数据是否为多段数据(文件上传)
if (ServletFileUpload.isMultipartContent(req)){
// 2.创建FileItemFactory工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
// 3.创建用于解析上传数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
// 4.解析上传数据,得到每一个表单项FileItem
List<FileItem> list = servletFileUpload.parseRequest(req);
// 5.循环判断每一个表单项是普通类型,还是文件类型
for(FileItem fileItem : list){
if(fileItem.isFormField()){
// 普通表单项
System.out.println("表单项的name属性值:"+fileItem.getFieldName());
System.out.println("表单项的value属性值"+fileItem.getString("UTF-8"));
}else{
// 文件表单项
System.out.println("表单项的name属性值:"+fileItem.getFieldName());
System.out.println("上传的文件名:"+fileItem.getName());
fileItem.write(new File("d://"+fileItem.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_jsp/uploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" /> <br/>
头像:<input type="file" name="photo" /> <br/>
<input type="submit" value="上传">
</form>
</body>
</html>

文件下载

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
package servlet;

public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取要下载的文件名
String downloadFileName = "cat.jpg";
// 2.通过servletContext对象 读取要下载的文件内容
ServletContext servletContext = getServletContext();
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);
// 获取响应输出流
OutputStream outputStream = resp.getOutputStream();
// 3.在回传前通过响应头告诉客户端返回的数据类型
String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
System.out.println("下载的文件类型:" + mimeType);
// 4.以及告诉客户端收到的数据是用于下载使用的
// 判断浏览器类型
String ua = req.getHeader("User-Agent");
String str="";
// 判断是否是火狐浏览器
if (ua.contains("Firefox")) {
// 使用下面的格式进行BASE64 编码后
str = "=?utf-8?B?" + new BASE64Encoder().encode("中文.jpg".getBytes("utf-8")) + "?=";
} else {
// 把中文名进行UTF-8 编码操作
str = URLEncoder.encode("中文.jpg", "UTF-8");
}
// Content-Disposition响应头,表示收到的数据该怎么处理
// attachment 附件,表示下载使用
// filename 表示指定下载的文件名
resp.setHeader("Content-Disposition", "attachment;fileName=" + str);
// 5.把要下载的文件内容回传给客户端
// 读取输入流中的全部数据,复制给输出流,输出给客户端
IOUtils.copy(resourceAsStream, outputStream);
}
}