把前端form表单里选中的文件(图片)上传到服务器
要用到的FileUpload组件
Apache FileUpload组件
maven路径
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
前端jsp页面
注:form表单的method和enctype的值要注意
- method="post"
- enctype="multipart/form-data"
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
文件上传到服务器
自己封装的文件(图片)上传工具类
import com.feng.Exception.UploadException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public class MyFileUtil {
// 设置允许接收的文件的格式
private static final String ALLWED_IMAGE_TYPE = "png,jpg,gif,jpeg"; // 这里设置为只能是图片
public static void frontToServerUpload(HttpServletRequest req) {
//解析和检查请求,是否是post方式,默认是二进制流格式
Boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (!isMultipart) {
return; //如果不是就不用上传了
}
try {
//创建FileItemFactory对象
FileItemFactory factory = new DiskFileItemFactory();
//设置缓存区大小,默认大小是10kb,
((DiskFileItemFactory) factory).setSizeThreshold(20 * 1024);// 单位b
//设置临时目录,默认是Tomcat下的temp,不建议设置
//((DiskFileItemFactory) factory).setRepository(临时目录不建议修改);
//创建文件上传的处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//解析请求
List items = upload.parseRequest(req);
//迭代出每一个FileItem
for (FileItem item : items) {
// 获取form表单里控件的name值
String fileName = item.getFieldName();
if (item.isFormField()) {
//普通的表单控件
//获取表单控件的value值
String value = item.getString("utf-8");
} else {
//file类型的表单控件
//----------------先获取上传文件的拓展名
/*
item.getName()获取文件名
FilenameUtils.getExtension(String filename);获取文件后缀
*/
String ext = FilenameUtils.getExtension(item.getName());
//把ALLWED_IMAGE_TYPE里的字符串通过","分割成一个字符串数组
String[] allowedImagetype = ALLWED_IMAGE_TYPE.split(",");
//-----------------判断上传文件的拓展名在不在设定的范围之内,不在的话抛出提醒并且结束方法
if (!Arrays.asList(allowedImagetype).contains(ext)) {
throw new UploadException("你上传的不是图片,请重新上传图片");
}
//上传文件的控件
//用UUID随机得到一个文件名
String RandomName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(item.getName());
//获取存放路径
String path = req.getSession().getServletContext().getRealPath("/upload");
System.out.println(path);
//判断文件夹是否存在,不在则创建
if(!new File(path).exists()){
new File(path).mkdirs();
}
item.write(new File(path, RandomName)); //把上传的文件保存到某个文件中
//System.out.println(item.isInMemory());//判断文件资源是否在内存中
}
}
}
//Exception会捕捉上方抛出的UploadException异常提示,便于把异常信息返回给Servlet
catch (UploadException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
}
}
}
自编写的文件异常类
用于servlet和和文件工具类的通信。
public class UploadException extends RuntimeException{
/**
*
* @param message 异常的信息,可以自定义的
*/
public UploadException(String message) {
super(message);
}
/**
*
* @param message 异常的信息
* @param cause 异常的根本原因
*/
public UploadException(String message, Throwable cause) {
super(message, cause);
}
}
文件上传servlet
import com.feng.Exception.UploadException;
import com.feng.Util.MyFileUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
MyFileUtil.frontToServerUpload(req);
}catch (UploadException e){
//拿到我们自己编写的的UploadException异常信息
String Msg=e.getMessage();
//把异常信息传给前端
req.setAttribute("errorMsg",Msg);
//请求转发到要跳转的页面
req.getRequestDispatcher("/jsp/file_to_server.jsp").forward(req,resp);
}
}
}
web.xml文件设置
<?xml version="1.0" encoding="UTF-8"?>
FileUpload
com.feng.servlet.FileUploadServlet
FileUpload
/fileUpload