zoukankan      html  css  js  c++  java
  • Java工具之上传文件

      4个代码

      1、前端JSP

      2、自定义异常类

      3、文件上传抽象类

      4、Servlet

    1.JSP

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>文件上传</title>
    </head>
    <body>
    <h3>文件上传</h3>
    <span style="color: red">${errorMsg}</span>
    <form action="/upload" method="post" enctype="multipart/form-data">
        账号:<input type="text" name="username"/><br>
        邮箱:<input type="email" name="email"><br>
        头像:<input type="file" name="headimg"><br>
    
        <input type="submit" value="注册">
    </form>
    </body>
    </html>

    2.自定义异常类

    package com.vae.Upload;
    
    public class LogicException extends RuntimeException{
    
        /**
         *
         * @param message 异常的信息,可以自定义的
         */
        public LogicException(String message) {
            super(message);
        }
    
        /**
         *
         * @param message 异常的信息
         * @param cause   异常的根本原因
         */
        public LogicException(String message, Throwable cause) {
            super(message, cause);
        }
    }

    3.文件上传的抽象类

    package com.vae.Upload;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadBase;
    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 FileUtil {
    
        //设置允许接收的文件的格式,我这里设置为只能是图片
        private static final String ALLWED_IMAGE_TYPE ="png,jpg,gif,jpeg";
    
        public static void upload(HttpServletRequest req) {
    
            //解析和检查请求,是否是post方式,默认是二进制流格式
            Boolean isMultipart=ServletFileUpload.isMultipartContent(req);
            if (!isMultipart) {
                return; //如果不是就不用上传了
            }
            try {
    
                //创建FileItemFactory对象
                FileItemFactory factory=new DiskFileItemFactory();
                //设置缓存区大小,默认大小是10kb,
                ((DiskFileItemFactory) factory).setSizeThreshold(20*1024);
                //设置临时目录,默认是Tomcat下的temp,不建议设置
                //((DiskFileItemFactory) factory).setRepository(临时目录不建议修改);
    
                //创建文件上传的处理器
                ServletFileUpload upload=new ServletFileUpload(factory);
                //单个文件上传大小限制为2M
                upload.setFileSizeMax(1024*1024*2);
                //这次请求上传文件的大小(整个表单)限制为3M
                upload.setSizeMax(1024*1024*3);
    
                //解析请求
                List<FileItem> items=upload.parseRequest(req);
                //迭代出每一个FileItem
                for (FileItem item : items) {
                    String fileName = item.getFieldName();
                    if (item.isFormField()) {
                        //普通的表单控件
                        String value = item.getString("utf-8");
                        System.out.println(fileName + "->" + value);
                    } else {
                        //----------------先获取上传文件的拓展名
                        String ext = FilenameUtils.getExtension(item.getName());
                        String [] allowedImagetype=ALLWED_IMAGE_TYPE.split(",");
                        //-----------------判断上传文件的拓展名在不在我设定的范围之内,不在的话提醒并且结束方法
                        if (!Arrays.asList(allowedImagetype).contains(ext)) {
                            throw  new LogicException("你上传的不是图片,请重新上传图片");
                        }
    
    
                        //上传文件的控件
                        String RandomName = UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(item.getName());
                        System.out.println(fileName + "->" + FilenameUtils.getName(item.getName())); //一个的标签的name,一个是文件的name
                        String path=req.getServletContext().getRealPath("/upload");
                        System.out.println(path);
                        item.write(new File(path, RandomName)); //把上传的文件保存到某个文件中
                        //System.out.println(item.isInMemory());//判断文件资源是否在内存中
                    }
                }
    
            }
            catch (FileUploadBase.FileSizeLimitExceededException e){
                throw new LogicException("单个文件的上传大小不得超过2M");
            }
            catch (FileUploadBase.SizeLimitExceededException e){
                throw  new LogicException("所有上传文件的大小不得超过3M");
            }
            //Exception会捕捉我们的LogicException异常提示,所以我们在上面写一个,便于把LogicException异常返回给Servlet
            catch (LogicException e){
                throw e;
            }
            catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    
    }

    4.Servlet

    package com.vae.Upload;
    
    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.IOException;
    
    @WebServlet("/upload")
    public class UploadServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            try {
                FileUtil.upload(req);
            }catch (LogicException e){
                //拿到我们的LogicException异常信息
                String Msg=e.getMessage();
                req.setAttribute("errorMsg",Msg);
                req.getRequestDispatcher("/input.jsp").forward(req,resp);
            }
    
        }
    
    }
  • 相关阅读:
    CheckedListBoxControl 实现复选框的单选与多选功能
    DEV控件中GridView中的复选框与CheckBox实现联动的全选功能
    pyhon3+phoenixdb访问phoenix
    greenplum 6.0 下gpbackup的编译与使用
    greenplum下schema的使用
    greenplum6.1 使用复制表
    python动态加载脚本
    将8进制数字(文件权限)转换为rwxrwxrwx格式字符显示
    python3 load data infile for mysql5.7
    编译mysql for Qt 5.13.0驱动
  • 原文地址:https://www.cnblogs.com/yunquan/p/10300450.html
Copyright © 2011-2022 走看看