zoukankan      html  css  js  c++  java
  • 文件的上传

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

      

     



  • 相关阅读:
    OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
    OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
    努比亚(nubia) M2青春版 NX573J 解锁BootLoader 并进入临时recovery ROOT
    华为 荣耀 等手机解锁BootLoader
    青橙 M4 解锁BootLoader 并刷入recovery ROOT
    程序员修炼之道阅读笔03
    冲刺8
    典型用户模板分析
    学习进度八
    冲刺7
  • 原文地址:https://www.cnblogs.com/ww103/p/12051160.html
Copyright © 2011-2022 走看看