文件的上传

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();
        }
    }
}

  

 



原文地址:https://www.cnblogs.com/ww103/p/12051160.html