FileUpload文件上传
1.fileUpload是apache的commons组件提供的上传组件,它最主要的工作就是帮我们解析request.getInpustream()。
首先需要导入2个ja包
- commons-fileUpload.jar
- commons-io.jar
2.使用fileUpload固定步骤
①创建工厂类 FileItemFactory fileItemFactory = new DiskFileItemFactory();
②创建解析器 ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
③使用解析器来解析request对象(也就是格式化请求) List<FileItem> list = servletFileUpload.parseRequest(req);
3.FileItem
一个FileItem对象对应一个表单项。FileItem类有如下方法:
String getFieldName():获取表单项的name的属性值。
String getName():获取文件字段的文件名。如果是普通字段,则返回null
String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。
String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。
long getSize():获取字段内容的大小,单位是字节。
boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。
InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流。
可能出现的问题
1.中文乱码问题
文件名 方式一:req.setCharacterEncoding("utf-8"); 方式二:servletFileUpload.setHeaderEncoding("utf-8");
表单普通字段中文乱码处理:
fileItem.getString("utf-8");
2.上传的文件夹名称必须给出: * 判断上传文件的文件夹名称 file.exists()
3.上传文件的路径 动态获取服务器路径 *String realPath = req.getServletContext().getRealPath("/img");
4.解决文件名相同时覆盖 UUID * String uuid = UUID.randomUUID().toString();
5、无法指定上传文件的大小:
方式一:upload.setSizeMax(20);
目前无法使用 有异常抓不住 需要使用SpringMVC
方式二:item.getSize()>20*1024
6、无法指定上传文件的类型 : *".jpg".equals(subString)
package com.bjsxt.servlet; import com.bjsxt.entity.Student; import com.bjsxt.serviceImp.StudentServiceImp; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; 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.List; import java.util.UUID; /** * @program: JavaEE * @description * @author: wuhao * @create: 2019-12-16 11:19 **/ @WebServlet("/servlet/FileServlet") public class FileServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获得文件上传的工厂对象 FileItemFactory fileItemFactory = new DiskFileItemFactory(); //获得文件上传的工厂组件 ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); //设置编码问题 servletFileUpload.setHeaderEncoding("utf-8"); try { String name=""; int age=0; int score=0; String fileName=""; String contentType=""; //获得前台表单的内容 List<FileItem> list = servletFileUpload.parseRequest(req);//格式化请求 for (FileItem fileItem : list) { if (!fileItem.isFormField()) { //获得文件类型 contentType = fileItem.getContentType(); //获得文件的后缀 String substring = fileItem.getName().substring(fileItem.getName().lastIndexOf(".")); //设置文件的类型 if(!(".jpg".equals(substring)||".png".equals(substring)||".gif".equals(substring))){ req.setAttribute("msg","上传文件的类型必须是图片"); req.getRequestDispatcher("/file.jsp").forward(req,resp); return; } if (fileItem.getSize()>20*1024){ req.setAttribute("msg", "文件大小不能超过20k"); req.getRequestDispatcher("/file.jsp").forward(req,resp ); return; } //设置文件名 String uuid = UUID.randomUUID().toString(); fileName = uuid + substring; //动态获取服务器路径 String realPath = req.getServletContext().getRealPath("/img"); File file = new File(realPath); if (!file.exists()) { //不存在创建 file.mkdirs(); } //文件类型 fileItem.write(new File(file, fileName)); } else { //文本类型 if ("name".equals(fileItem.getFieldName())){ name = fileItem.getString("utf-8"); } if ("age".equals(fileItem.getFieldName())){ age = Integer.parseInt(fileItem.getString()); } if ("score".equals(fileItem.getFieldName())){ score = Integer.parseInt(fileItem.getString()); } } } int i = new StudentServiceImp().addOne(new Student(0, name, age, score, fileName, contentType)); if (i>0){ resp.sendRedirect(req.getContextPath()+"/show3.jsp"); }else { req.setAttribute("msg","注册失败" ); req.getRequestDispatcher("/file.jsp").forward(req,resp ); } } catch (Exception e) { e.printStackTrace(); } } }