文件的上传与下载
文件的上传和下载是非常常见的功能。在很多系统或者软件中都经常使用文件的上传和下载。
文件的上传(重点)
上传文件步骤
- 有一个form标签,
method=post
请求 - form标签的
encType
属性值必须为multipart/form-data
值 - 在form标签中使用
input type=file
添加需要上传的文件 - 编写(Servlet程序)服务器代码接收,处理上传的数据
encType=mulipart/form-data 表单提交的数据,以多端(每一个表单项一个数据段)形式进行拼接,然后以二进制流的形式发送给服务器
这里还需要导入两个jar包:
- commons-fileupload-1.2.1.jar https://nowjava.com/jar/detail/m05126985/commons-fileupload-1.2.1.jar.html
- commons-io-1.4.jar https://nowjava.com/jar/detail/m02261680/commons-io-1.4.jar.html
代码演示
UploadServlet.java
package code;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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.util.List;
/**
* @BelongsProject: JavaWeb
* @BelongsPackage: UploadServlet
* @Author: HeXin
* @CreateTime: 2023/2/2 21:57
* @Description: 文件的上传与下载
* @Version: 1.0
*/
public class UploadServlet extends HttpServlet {
/**
* @Description: 用来处理文件上传的数据
* @CreateTime:2023/2/2 21:58
* @Author:HeXin
*/
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断上传的数据是否是多端数据(只有多端的数据,才是文件上传的)
if(ServletFileUpload.isMultipartContent(req)){
//创建FileItemFactory工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
//创建用于解析上传数据的工具类
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
//解析上传的数据,得到每一个表单项FileItem
try {
List<FileItem> list = upload.parseRequest(req);
//循环判断每一个表单项是否是上传的文件
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("E:\\"+fileItem.getName()));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
upload.jsp
<%--
Created by IntelliJ IDEA.
User: He
Date: 2023/2/2
Time: 21:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/EL/upload" 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>
web.xml
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>code.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
文件下载
Download.java
package code;
import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
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;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
/**
* @BelongsProject: JavaWeb
* @BelongsPackage: Download
* @Author: HeXin
* @CreateTime: 2023/2/3 8:51
* @Description:
* @Version: 1.0
*/
public class Download extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取下载的文件名
String fileName = "1.png";
//读取要下载的文件内容
ServletContext servlet = getServletContext();
//获取要下载的文件类型
String mimeType = servlet.getMimeType("/" + fileName);
//在回传前,通过响应头告诉客户端返回的数据类型
resp.setContentType(mimeType);
//使用响应头告诉客户端收到的数据用于下载
if(req.getHeader("User-Agent").contains("Firefox")){//如果是火狐浏览器,则使用Base64编码
resp.setHeader("Content-Disposition","attachment;filename=?UTF-8?"+
new BASE64Encoder().encode("动漫.jsp".getBytes("UTF-8"))+"?=");
}else{//如果不是火狐,则用URL编码
resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("动漫.jpg","UTF-8"));
}
//斜杠被服务器解析表示地址为http://ip:port/工程名/ 映射到代码的web目录
InputStream inputStream = servlet.getResourceAsStream("/" + fileName);
//获取响应的输出流
ServletOutputStream outputStream = resp.getOutputStream();
//读取输入流的内容,复制到输出流,并输出给客户端
IOUtils.copy(inputStream, outputStream);
}
}
web.xml
<servlet>
<servlet-name>Download</servlet-name>
<servlet-class>code.Download</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>