fileupload官网网址:可以去查看详细的文档,也有实例代码FileUpload – Homehttp://commons.apache.org/proper/commons-fileupload/
项目环境:我的前端使用vue写的,后端是用原生的servlet写的
upload.parseRequest(req);
这一条语句本该获取到一个List,可是我获取到的确是空的。百度很多都说是因为被自动转换或者是被过滤,但是他们的环境都是ssm,或者springboot,我这个是原生servlet明显不是这个原因。
原因:文件缓冲区和上传单个文件的最大值没有设置或这设置的太小了(我开始填了个10进去好像)哈哈,完整代码最后贴出
DiskFileItemFactory fif = new DiskFileItemFactory();
//设置文件缓冲区大小为4M
fif.setSizeThreshold(1024 * 1024 * 4);
//当上传文件超过缓冲区大小时,启用临时文件夹进行缓存(暂存)
fif.setRepository(new File(req.getSession().getServletContext().getRealPath("/") + "tem"));
ServletFileUpload upload = new ServletFileUpload(fif);
//设置上传的单个文件的最大值是4M
upload.setSizeMax(1024 * 1024 * 4);
到这里就可以从jsp页面上传文件了,但是我用了vue项目,会出现跨域问题。
这里需要配置一个过滤器(这是全局的)
@WebFilter("/*")
public class CrossFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, PATCH, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type, Accept, Origin");
response.setHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
也可以单独设置一个过滤器。
以下是servlet代码,也不够完善,比如限制上传文件的类型什么的也还没有设置,直接写在controller了,这段代码还可以封装一下。
package com.controller;
import com.util.UUIDUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.Iterator;
import java.util.List;
@WebServlet("/upload")
public class Upload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
if (ServletFileUpload.isMultipartContent(req)) {
DiskFileItemFactory fif = new DiskFileItemFactory();
//设置文件缓冲区大小为4M
fif.setSizeThreshold(1024 * 1024 * 4);
//当上传文件超过缓冲区大小时,启用临时文件夹进行缓存(暂存)
fif.setRepository(new File(req.getSession().getServletContext().getRealPath("/") + "tem"));
ServletFileUpload upload = new ServletFileUpload(fif);
//设置上传的单个文件的最大值是4M
upload.setSizeMax(1024 * 1024 * 4);
//解决中文路径或者文件名乱码问题
upload.setHeaderEncoding("UTF-8");
try {
List<FileItem> items = upload.parseRequest(req);
Iterator<FileItem> it = items.iterator();
while (it.hasNext()) {
FileItem item = it.next();
//1. 文本域
if (item.isFormField()) {
//TODO:
String name = item.getFieldName();
//字段值是中文,以utf-8获取
String value = item.getString("utf-8");
}
//2. 文件域
else {
// 判断上传的文件是否是图片;非空则说明是图片
if (ImageIO.read(item.getInputStream()) != null) {
String fileName = item.getName();
if (fileName == null){
throw new Exception();
}
System.out.println(fileName);
String[] split = fileName.split("\\.");
System.out.println(split[1]);
String lastName = split[1];
// 设置文件上传路径(获取真实物理路径)
File file = new File(req.getSession().getServletContext().getRealPath("/") + "img",
UUIDUtil.getUUID()+"."+lastName);
item.write(file);
} else {
System.out.println("非图片!");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
这是导的两个依赖,maven导的
<!--图片上传-->
<!--https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<!--https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>