• 文件的上传


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

      

     



  • 相关阅读:
    阿里云系列——3.企业网站备案步骤---2018-1-4
    关于VS2017安装的一点扩充说明(15.5)
    Git环境配置+VSCode中文乱码问题
    抛砖引玉之~sftp
    关于链接文件的探讨
    VSCode插件MSSQL教程(昨天提了一下)
    SQL Server 2017 安装过程中的一点说明(有点意思)
    PS如何批量生成缩略图(方法可以通用其他重复劳动)
    mdb导入SqlServer
    01.码医入门(完篇)
  • 原文地址:https://www.cnblogs.com/ww103/p/12051160.html
Copyright © 2020-2023  润新知