文件上传
不论是文件的上传还是下载都是网页中很常见的功能。
步骤
- 必须要有 form 标签,发送方式必须为 post
- form 标签的 encType 属性值必须为 multipart/form-data
- from标签中须使用 input type=file
- 需要编写服务器来接收文件
请求说明:
实现文件上传
jsp
<body>
<form action="http://localhost:8080/WebTest06_upload_download/uploadServlet" method="post" enctype="multipart/form-data" >
昵称:<input type="text" name="nickname"><br/>
头像:<input type="file" name="icon"><br/>
<input type="submit" value="上传头像">
</form>
</body>
引入commons-fileupload用于文件上传与下载
maven导包
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
使用其中的ServletFileUpload完成文件上传与下载
ServletFileUpload类介绍
public class ServletFileUpload extends FileUpload {
private static final String POST_METHOD = "POST";
//是否为多段数据
public static final boolean isMultipartContent(HttpServletRequest request) {
return !"POST".equalsIgnoreCase(request.getMethod()) ? false : FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
public ServletFileUpload() {
}
public ServletFileUpload(FileItemFactory fileItemFactory) {
super(fileItemFactory);
}
//解析请求放入list中
public List<FileItem> parseRequest(HttpServletRequest request) throws FileUploadException {
return this.parseRequest(new ServletRequestContext(request));
}
//解析请求放入map中
public Map<String, List<FileItem>> parseParameterMap(HttpServletRequest request) throws FileUploadException {
return this.parseParameterMap(new ServletRequestContext(request));
}
public FileItemIterator getItemIterator(HttpServletRequest request) throws FileUploadException, IOException {
return super.getItemIterator(new ServletRequestContext(request));
}
}
实现服务器端代码(servlet)
/**
* @describe: 文件上传Servlet
* @author: ylt
* @create: 2022-01-13 21:24
**/
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件上传了");
//创建FileItemFactory实现类对象
FileItemFactory fileItemFactory = new DiskFileItemFactory();
//创建ServletFileUpload对象用于文件的上传和下载
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
//判断请求是否为多段请求,只有请求是多段的才是文件上传请求
if (ServletFileUpload.isMultipartContent(req)){
//解析+处理
try {
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
//遍历
for (FileItem fileItem : fileItems) {
//如果是普通表单项
if (fileItem.isFormField()) {
System.out.println(fileItem.getFieldName() + ":" + fileItem.getString());
}else {
//如果是需要上传的文件
String name = new String(fileItem.getName().getBytes(),"UTF-8");
System.out.println("上传的文件名:" + name);
System.out.println("表单的name:" + fileItem.getFieldName());
//写入
fileItem.write(new File("F:\\Java_Study\\JavaWeb_Study\\WebTest06_upload_download\\src\\main\\icon\\"+name));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}