ServletFileUpload简单介绍-飞外

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(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   / 的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);