* 文件上传
(1) 文件上传的流程图:
如图所示,这就是一个简易的文件上传的过程,用户想要上传一个文件,首先要让浏览器支持文件上传,通过网络传输,将文件上传到远程的服务器,然后把文件传到服务器中的Web应用中,进而保存在FileSystem中。
(2) 文件上传的注意事项
- 上传文件应该在外界无法直接访问的目录下,比如 WEB-INF目录下
- 为了防止文件覆盖,上传的文件要有唯一的文件名,可以采用 时间戳(不完全安全) uuid MD5
- 要限制上传文件的大小
- 可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法
- 在这里也要注意,文件上传,在页面表单提交时,一定采用的是post提交,因为get上传文件大小有限制只有几kb,post上传文件大小无限制
(3) 文件上传的准备工作
- 下载jar包
- https://mvnrepository.com/artifact/commons-io/commons-io
- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
- 导入jar包
(4) 对于文件上传所需要的类的介绍
FileItem类
- 在HTML页面input 必须有 name 表单
- 如果包含一个文件上传输入项的话,这个表单的enctype属性就必须设置multipart/form-data
- 常用方法介绍:
//isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单
//还是一个文件表单,如果是普通表单字段则返回true,否则返回false
boolean isFormField();
//getFieldName方法用于返回表单标签name属性的值。
String getFieldName();
//getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回
String getString();
//getName方法用于获得文件上传字段中的文件名。
String getName();
//以流的形式返回上传文件的数据内容。
InputStream getInputStream()
//delete方法用来清空FileItem类对象中存放的主体内容
//如果主体内容被保存在临时文件中,delete方法将删除该临时文件。
void delete();
ServletFileUpload 类
package com.yues.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
if (!ServletFileUpload.isMultipartContent(request)) {
return;//如果是普通文件,我们可以直接返回
} //通过这个if,说明我们的表单是带文件上传的;
String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdir();
}
//临时路径,假如文件超过了预期的大小,我们就把他放到一个临时文件中,过几天自动删除,或者提醒用户转存为永久
String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");
File file = new File(tmpPath);
if (!file.exists()) {
file.mkdir();
}
//建议使用 Apache的文件上传组件来实现,common-f