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);  
posted @ 2018-01-12 14:30  snakejia  阅读(3146)  评论(0编辑  收藏  举报