记录一下jsp的上传文件的写法。。主要是这个东西不好记,我也不想记。。写下来是最好的,到时候肯定会忘记。。。
1. 导入依赖
文件上传首先是需要两个包,这个随便找个教程了解一下都是这样的。
一个是
fileupload 还有一个是IO 包,都是Apache基金会下面的项目。。。
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
https://mvnrepository.com/artifact/commons-io/commons-io/2.8.0
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
2. 文件上传的表单
例如下面这样写,
注意:这个表单必须是post请求,并且需要有 enctype=“multipart/form-data” 这个属性
<form method="post" action="${pageContext.request.contextPath}/ad/fileupload" enctype="multipart/form-data">
<input type="text" required name="filename">
<input type="file" required name="uploadfile">
</form>
3. servlet
然后就可以开始写我们上传文件的逻辑了
这里有三个对象要注意
分别是
- DiskFileItemFactory:工厂类
- ServletFileUpload:处理文件上传
- FileItem:具体的表单对象
@WebServlet(urlPatterns = "/ad/fileupload")
public class AdAddServlet extends HttpServlet {
AdServiceImpl adService = new AdServiceImpl();
// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String fileName = "";
//如果这个是普通的表单,那就直接结束方法
if (!ServletFileUpload.isMultipartContent(req)) {
return;
}
//上传文件的目录最好在web-inf下面,安全,用户无法直接访问
String uploadPath = this.getServletContext().getRealPath("/upload/img");
File uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdir();
}
//缓存 -- 临时文件:如果文件超过了预期的大小,那就把这个文件放到临时文件中华,过几天再删除
String temPath = this.getServletContext().getRealPath("/WEB-INF/tem");
System.out.println(uploadPath);
File temFile = new File(temPath);
if (!temFile.exists()) {
temFile.mkdir();
}
//1. 创建 DiskFileItemFactory 用于限制文件大小之类的参数,如果不写的话,那就是默认值了
DiskFileItemFactory factory = getDiskFileItemFactory(temFile);
//2. 获取ServletFileUpload
ServletFileUpload upload = getServletFileUpload(factory);
//3. 把前端的请求封装成一个FileItem对象 (每一个表单对象)
try {
List<FileItem> fileItems = upload.parseRequest(req);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {//如果这个是普通的表单就正常的流程
System.out.println("表单字段的name:"+fileItem.getFieldName());
System.out.println("表单字段的value"+fileItem.getString("utf-8"));
} else {//文件
//处理文件
String uploadFileName = fileItem.getName();
if (uploadFileName.trim().equals("") || uploadFileName == null) { //文件名不合法
continue;
}
//获取上传的文件名
fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
fileItem.write(new File(uploadPath + "/" + fileName));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
resp.sendRedirect("../upload/img/" + fileName);
}
//封装DiskFileItemFactory 和 ServletFileUpload 对象
private static DiskFileItemFactory getDiskFileItemFactory(File file) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(MEMORY_THRESHOLD);
factory.setRepository(file); //临时文件
return factory;
}
private static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
// 设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
// 中文处理
upload.setHeaderEncoding("UTF-8");
return upload;
}
}
注意: 最后上传之后的文件,将不会出现在你的项目中,而是出现在编译的目录中。。 如果你是用的idea,那就是out目录中,可以自己找到