• ServletFileUpload 简单介绍


    1.ServletFileUpload类源码

    
    public class ServletFileUpload extends FileUpload {
    
        /**
         * Constant for HTTP POST method.
         */
        private static final String POST_METHOD = "POST";
    
        /**
         *确定请求是否包含多部分内容。可用来判断是否是文件上传请求
         */
        public static final boolean isMultipartContent(
                HttpServletRequest request) {
            if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
                return false;
            }
            return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
        }
    
        /**
        *构造器
        */
        public ServletFileUpload() {
            super();
        }
        public ServletFileUpload(FileItemFactory fileItemFactory) {
            super(fileItemFactory);
        }
    
        /**
        * 解析上传文件的multipart/form-data流,返回按照传输顺序解析出的FileItem实例列表 
         */
        @Override
        public List<FileItem> parseRequest(HttpServletRequest request)
        throws FileUploadException {
            return parseRequest(new ServletRequestContext(request));
        }
    
        /**
         * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
         * compliant <code>multipart/form-data</code> stream.
         * @since 1.3
         */
        public Map<String, List<FileItem>> parseParameterMap(HttpServletRequest request)
                throws FileUploadException {
            return parseParameterMap(new ServletRequestContext(request));
        }
    
        /**
         * 解析上传文件的multipart/form-data流,返回按照传输顺序解析出的FileItemStream实例迭代器
         */
        public FileItemIterator getItemIterator(HttpServletRequest request)
        throws FileUploadException, IOException {
            return super.getItemIterator(new ServletRequestContext(request));
        }
    
    }
    
    

    2.FileUpload类源码

    public class FileUpload extends FileUploadBase {
    
        /**
         * The factory to use to create new form items.
         */
        private FileItemFactory fileItemFactory;
        
        public FileUpload() {
            super();
        }
        
        public FileUpload(FileItemFactory fileItemFactory) {
            super();
            this.fileItemFactory = fileItemFactory;
        }
        
        @Override
        public FileItemFactory getFileItemFactory() {
            return fileItemFactory;
        }
    
        @Override
        public void setFileItemFactory(FileItemFactory factory) {
            this.fileItemFactory = factory;
        }
    }
    
    

    3.FileItemFactory接口源码

    public interface FileItemFactory {
    
        FileItem createItem(
                String fieldName,
                String contentType,
                boolean isFormField,
                String fileName
                );
    }
    

    4.DiskFileItemFactory类源码

    public class DiskFileItemFactory implements FileItemFactory {
    
        /**
         * 将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb。
         */
        public static final int DEFAULT_SIZE_THRESHOLD = 10240;
    
        /**
         * 用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径
         */
        private File repository;
    
        /**
         * 用于保存将文件保存在内存还是磁盘临时文件夹的临界值
         */
        private int sizeThreshold = DEFAULT_SIZE_THRESHOLD;
    
        /**
        *用于追踪产生的临时文件。如果不想追踪临时文件,设置 
        *FileCleaningTracker 为null。
         */
        private FileCleaningTracker fileCleaningTracker;
    
    
        public DiskFileItemFactory() {
            this(DEFAULT_SIZE_THRESHOLD, null);
        }
        public DiskFileItemFactory(int sizeThreshold, File repository) {
            this.sizeThreshold = sizeThreshold;
            this.repository = repository;
        }
    
        public File getRepository() { return repository; }
        public void setRepository(File repository) { this.repository = repository; }
    
        public int getSizeThreshold() { return sizeThreshold; }
        public void setSizeThreshold(int sizeThreshold) { this.sizeThreshold = sizeThreshold; }
    
        public FileCleaningTracker getFileCleaningTracker() { return fileCleaningTracker; }
        public void setFileCleaningTracker(FileCleaningTracker pTracker) { fileCleaningTracker = pTracker;}
    
    
        public FileItem createItem(String fieldName, String contentType,
                boolean isFormField, String fileName) {
            DiskFileItem result = new DiskFileItem(fieldName, contentType,
                    isFormField, fileName, sizeThreshold, repository);
            FileCleaningTracker tracker = getFileCleaningTracker();
            if (tracker != null) {
                tracker.track(result.getTempFile(), result);
            }
            return result;
        }
    
    
    }
    
    

    5.FileItem类

    public interface FileItem extends Serializable, FileItemHeadersSupport {
    
        //以流的形式返回上传文件的数据内容。
        InputStream getInputStream() throws IOException;
        
        //getContentType 方法用于获得上传文件的类型,即表单字段元素描述头属性“Content-Type”的值,如“image/jpeg”。
        //如果FileItem类对象对应的是普通表单字段,该方法将返回null。
        String getContentType();
        
        // getName方法用于获得文件上传字段中的文件名。
        String getName();
        
        //isInMemory方法用来判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,
        //如果存储在内存中则返回true,否则返回false。
        boolean isInMemory();
        
        //返回该上传文件的大小(以字节为单位)
        long getSize();
    
        byte[] get();
        
        //getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回,它有两个重载的定义形式:
        //前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码将主体内容转换成字符串
        //如果在读取普通表单字段元素的内容时出现了中文乱码现象,请调用第二个getString方法,并为之传递正确的字符集编码名称
        String getString(String encoding) throws UnsupportedEncodingException;
        String getString();
    
        //它主要用途是将上传的文件内容保存在本地文件系统中
        void write(File file) throws Exception;
        
        //delete方法用来清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete方法将删除该临时文件。
        //尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,
        //释放系统存储资源。另外,当系统出现异常时,仍有可能造成有的临时文件被永久保存在了硬盘中。
        void delete();
        
        //getFieldName方法用于返回表单标签name属性的值。如上例中<input type="text" name="column" />的value
        String getFieldName();
        void setFieldName(String name);
        
        //isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,
        //如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,
        //还是文件上传表单域
        boolean isFormField();
        void setFormField(boolean state);
    
        OutputStream getOutputStream() throws IOException;
    
    }
    
    

    6.简单的使用流程

    DiskFileItemFactory factory = new DiskFileItemFactory();  
    factory.setSizeThreshold(MaxMemorySize);  
    factory.setRepository(TempDirectory);  
      
    ServletFileUpload upload = new ServletFileUpload(factory);  
      
    upload.setSizeMax(yourMaxRequestSize);  
      
    List<FileItem> items = upload.parseRequest(request);  
    
  • 相关阅读:
    FastAPI:Python 世界里最受欢迎的异步框架
    Mosquitto 添加wss协议(HTTPS使用阿里云证书)
    c# .netcore3.1 unipush(个推)服务端开发笔记
    ASP.NET Core Kestrel部署HTTPS
    微信小程序长按事件会触发点击事件问题
    yum 安装nginx遇到的问题
    nginx解决跨域问题配置
    nginx配置访问域名返回404页面,其他页面可以访问
    Nginx如何实现一个域名访问多个项目
    C# WinForm程序退出的方法
  • 原文地址:https://www.cnblogs.com/snakejia/p/8275604.html
Copyright © 2020-2023  润新知