一、前言
关于apache的commons-fileupload包中文件上传org.apache.commons.fileupload.FileUploadBase基类,详情参见源码说明
二、源码说明
1.FileUloadBase
package org.apache.commons.fileupload;@b@@b@import java.io.IOException;@b@import java.io.InputStream;@b@import java.io.UnsupportedEncodingException;@b@import java.util.ArrayList;@b@import java.util.HashMap;@b@import java.util.Iterator;@b@import java.util.List;@b@import java.util.Locale;@b@import java.util.Map;@b@import java.util.NoSuchElementException;@b@import javax.servlet.http.HttpServletRequest;@b@import org.apache.commons.fileupload.servlet.ServletFileUpload;@b@import org.apache.commons.fileupload.servlet.ServletRequestContext;@b@import org.apache.commons.fileupload.util.Closeable;@b@import org.apache.commons.fileupload.util.FileItemHeadersImpl;@b@import org.apache.commons.fileupload.util.LimitedInputStream;@b@import org.apache.commons.fileupload.util.Streams;@b@@b@public abstract class FileUploadBase@b@{@b@ public static final String CONTENT_TYPE = "Content-type";@b@ public static final String CONTENT_DISPOSITION = "Content-disposition";@b@ public static final String CONTENT_LENGTH = "Content-length";@b@ public static final String FORM_DATA = "form-data";@b@ public static final String ATTACHMENT = "attachment";@b@ public static final String MULTIPART = "multipart/";@b@ public static final String MULTIPART_FORM_DATA = "multipart/form-data";@b@ public static final String MULTIPART_MIXED = "multipart/mixed";@b@@b@ @Deprecated@b@ public static final int MAX_HEADER_SIZE = 1024;@b@ private long sizeMax;@b@ private long fileSizeMax;@b@ private String headerEncoding;@b@ private ProgressListener listener;@b@@b@ public FileUploadBase()@b@ {@b@ this.sizeMax = -1L;@b@@b@ this.fileSizeMax = -1L;@b@ }@b@@b@ public static final boolean isMultipartContent(RequestContext ctx)@b@ {@b@ String contentType = ctx.getContentType();@b@ if (contentType == null) {@b@ return false;@b@ }@b@@b@ return (contentType.toLowerCase(Locale.ENGLISH).startsWith("multipart/"));@b@ }@b@@b@ @Deprecated@b@ public static boolean isMultipartContent(HttpServletRequest req)@b@ {@b@ return ServletFileUpload.isMultipartContent(req);@b@ }@b@@b@ public abstract FileItemFactory getFileItemFactory();@b@@b@ public abstract void setFileItemFactory(FileItemFactory paramFileItemFactory);@b@@b@ public long getSizeMax()@b@ {@b@ return this.sizeMax;@b@ }@b@@b@ public void setSizeMax(long sizeMax)@b@ {@b@ this.sizeMax = sizeMax;@b@ }@b@@b@ public long getFileSizeMax()@b@ {@b@ return this.fileSizeMax;@b@ }@b@@b@ public void setFileSizeMax(long fileSizeMax)@b@ {@b@ this.fileSizeMax = fileSizeMax;@b@ }@b@@b@ public String getHeaderEncoding()@b@ {@b@ return this.headerEncoding;@b@ }@b@@b@ public void setHeaderEncoding(String encoding)@b@ {@b@ this.headerEncoding = encoding;@b@ }@b@@b@ @Deprecated@b@ public List<FileItem> parseRequest(HttpServletRequest req)@b@ throws FileUploadException@b@ {@b@ return parseRequest(new ServletRequestContext(req));@b@ }@b@@b@ public FileItemIterator getItemIterator(RequestContext ctx)@b@ throws FileUploadException, IOException@b@ {@b@ try@b@ {@b@ return new FileItemIteratorImpl(ctx);@b@ }@b@ catch (FileUploadIOException e) {@b@ throw ((FileUploadException)e.getCause());@b@ }@b@ }@b@@b@ public List<FileItem> parseRequest(RequestContext ctx)@b@ throws FileUploadException@b@ {@b@ List items = new ArrayList();@b@ boolean successful = false;@b@ try {@b@ FileItemIterator iter = getItemIterator(ctx);@b@ FileItemFactory fac = getFileItemFactory();@b@ if (fac == null)@b@ throw new NullPointerException("No FileItemFactory has been set.");@b@ FileItem fileItem;@b@ while (iter.hasNext()) {@b@ item = iter.next();@b@@b@ String fileName = ((FileItemIteratorImpl.FileItemStreamImpl)item).name;@b@ fileItem = fac.createItem(item.getFieldName(), item.getContentType(), item.isFormField(), fileName);@b@@b@ items.add(fileItem);@b@ try {@b@ Streams.copy(item.openStream(), fileItem.getOutputStream(), true);@b@ } catch (FileUploadIOException e) {@b@ throw ((FileUploadException)e.getCause());@b@ } catch (IOException e) {@b@ throw new IOFileUploadException(String.format("Processing of %s request failed. %s", new Object[] { "multipart/form-data", e.getMessage() }), e);@b@ }@b@@b@ FileItemHeaders fih = item.getHeaders();@b@ fileItem.setHeaders(fih);@b@ }@b@ successful = true;@b@ FileItemStream item = items;@b@ Iterator i$;@b@ return item;@b@ }@b@ catch (FileUploadIOException e)@b@ {@b@ }@b@ catch (IOException e)@b@ {@b@ }@b@ finally@b@ {@b@ if (!(successful))@b@ for (FileItem fileItem : items)@b@ try {@b@ fileItem.delete();@b@ }@b@ catch (Throwable e)@b@ {@b@ }@b@ }@b@ }@b@@b@ public Map<String, List<FileItem>> parseParameterMap(RequestContext ctx)@b@ throws FileUploadException@b@ {@b@ List items = parseRequest(ctx);@b@ Map itemsMap = new HashMap(items.size());@b@@b@ for (FileItem fileItem : items) {@b@ String fieldName = fileItem.getFieldName();@b@ List mappedItems = (List)itemsMap.get(fieldName);@b@@b@ if (mappedItems == null) {@b@ mappedItems = new ArrayList();@b@ itemsMap.put(fieldName, mappedItems);@b@ }@b@@b@ mappedItems.add(fileItem);@b@ }@b@@b@ return itemsMap;@b@ }@b@@b@ protected byte[] getBoundary(String contentType)@b@ {@b@ ParameterParser parser = new ParameterParser();@b@ parser.setLowerCaseNames(true);@b@@b@ Map params = parser.parse(contentType, new char[] { ';', ',' });@b@ String boundaryStr = (String)params.get("boundary");@b@@b@ if (boundaryStr == null)@b@ return null;@b@ byte[] boundary;@b@ try@b@ {@b@ boundary = boundaryStr.getBytes("ISO-8859-1");@b@ } catch (UnsupportedEncodingException e) {@b@ boundary = boundaryStr.getBytes();@b@ }@b@ return boundary;@b@ }@b@@b@ @Deprecated@b@ protected String getFileName(Map<String, String> headers)@b@ {@b@ return getFileName(getHeader(headers, "Content-disposition"));@b@ }@b@@b@ protected String getFileName(FileItemHeaders headers)@b@ {@b@ return getFileName(headers.getHeader("Content-disposition"));@b@ }@b@@b@ private String getFileName(String pContentDisposition)@b@ {@b@ String fileName = null;@b@ if (pContentDisposition != null) {@b@ String cdl = pContentDisposition.toLowerCase(Locale.ENGLISH);@b@ if ((cdl.startsWith("form-data")) || (cdl.startsWith("attachment"))) {@b@ ParameterParser parser = new ParameterParser();@b@ parser.setLowerCaseNames(true);@b@@b@ Map params = parser.parse(pContentDisposition, ';');@b@ if (params.containsKey("filename")) {@b@ fileName = (String)params.get("filename");@b@ if (fileName != null) {@b@ fileName = fileName.trim();@b@ }@b@ else@b@ {@b@ fileName = "";@b@ }@b@ }@b@ }@b@ }@b@ return fileName;@b@ }@b@@b@ protected String getFieldName(FileItemHeaders headers)@b@ {@b@ return getFieldName(headers.getHeader("Content-disposition"));@b@ }@b@@b@ private String getFieldName(String pContentDisposition)@b@ {@b@ String fieldName = null;@b@ if ((pContentDisposition != null) && (pContentDisposition.toLowerCase(Locale.ENGLISH).startsWith("form-data")))@b@ {@b@ ParameterParser parser = new ParameterParser();@b@ parser.setLowerCaseNames(true);@b@@b@ Map params = parser.parse(pContentDisposition, ';');@b@ fieldName = (String)params.get("name");@b@ if (fieldName != null) {@b@ fieldName = fieldName.trim();@b@ }@b@ }@b@ return fieldName;@b@ }@b@@b@ @Deprecated@b@ protected String getFieldName(Map<String, String> headers)@b@ {@b@ return getFieldName(getHeader(headers, "Content-disposition"));@b@ }@b@@b@ @Deprecated@b@ protected FileItem createItem(Map<String, String> headers, boolean isFormField)@b@ throws FileUploadException@b@ {@b@ return getFileItemFactory().createItem(getFieldName(headers), getHeader(headers, "Content-type"), isFormField, getFileName(headers));@b@ }@b@@b@ protected FileItemHeaders getParsedHeaders(String headerPart)@b@ {@b@ int len = headerPart.length();@b@ FileItemHeadersImpl headers = newFileItemHeaders();@b@ int start = 0;@b@ while (true) {@b@ int end = parseEndOfLine(headerPart, start);@b@ if (start == end) {@b@ break;@b@ }@b@ StringBuilder header = new StringBuilder(headerPart.substring(start, end));@b@ start = end + 2;@b@ while (start < len) {@b@ int nonWs = start;@b@ while (nonWs < len) {@b@ char c = headerPart.charAt(nonWs);@b@ if ((c != ' ') && (c != '\t')) {@b@ break;@b@ }@b@ ++nonWs;@b@ }@b@ if (nonWs == start) {@b@ break;@b@ }@b@@b@ end = parseEndOfLine(headerPart, nonWs);@b@ header.append(" ").append(headerPart.substring(nonWs, end));@b@ start = end + 2;@b@ }@b@ parseHeaderLine(headers, header.toString());@b@ }@b@ return headers;@b@ }@b@@b@ protected FileItemHeadersImpl newFileItemHeaders()@b@ {@b@ return new FileItemHeadersImpl();@b@ }@b@@b@ @Deprecated@b@ protected Map<String, String> parseHeaders(String headerPart)@b@ {@b@ FileItemHeaders headers = getParsedHeaders(headerPart);@b@ Map result = new HashMap();@b@ for (Iterator iter = headers.getHeaderNames(); iter.hasNext(); ) {@b@ String headerName = (String)iter.next();@b@ Iterator iter2 = headers.getHeaders(headerName);@b@ StringBuilder headerValue = new StringBuilder((String)iter2.next());@b@ while (iter2.hasNext()) {@b@ headerValue.append(",").append((String)iter2.next());@b@ }@b@ result.put(headerName, headerValue.toString());@b@ }@b@ return result;@b@ }@b@@b@ private int parseEndOfLine(String headerPart, int end)@b@ {@b@ int index = end;@b@ while (true) {@b@ int offset = headerPart.indexOf(13, index);@b@ if ((offset == -1) || (offset + 1 >= headerPart.length())) {@b@ throw new IllegalStateException("Expected headers to be terminated by an empty line.");@b@ }@b@@b@ if (headerPart.charAt(offset + 1) == '\n') {@b@ return offset;@b@ }@b@ index = offset + 1;@b@ }@b@ }@b@@b@ private void parseHeaderLine(FileItemHeadersImpl headers, String header)@b@ {@b@ int colonOffset = header.indexOf(58);@b@ if (colonOffset == -1)@b@ {@b@ return;@b@ }@b@ String headerName = header.substring(0, colonOffset).trim();@b@ String headerValue = header.substring(header.indexOf(58) + 1).trim();@b@@b@ headers.addHeader(headerName, headerValue);@b@ }@b@@b@ @Deprecated@b@ protected final String getHeader(Map<String, String> headers, String name)@b@ {@b@ return ((String)headers.get(name.toLowerCase(Locale.ENGLISH)));@b@ }@b@@b@ public ProgressListener getProgressListener()@b@ {@b@ return this.listener;@b@ }@b@@b@ public void setProgressListener(ProgressListener pListener)@b@ {@b@ this.listener = pListener;@b@ }@b@@b@ public static class FileSizeLimitExceededException extends FileUploadBase.SizeException@b@ {@b@ private static final long serialVersionUID = 8150776562029630058L;@b@ private String fileName;@b@ private String fieldName;@b@@b@ public FileSizeLimitExceededException(String message, long actual, long permitted)@b@ {@b@ super(message, actual, permitted);@b@ }@b@@b@ public String getFileName()@b@ {@b@ return this.fileName;@b@ }@b@@b@ public void setFileName(String pFileName)@b@ {@b@ this.fileName = pFileName;@b@ }@b@@b@ public String getFieldName()@b@ {@b@ return this.fieldName;@b@ }@b@@b@ public void setFieldName(String pFieldName)@b@ {@b@ this.fieldName = pFieldName;@b@ }@b@ }@b@@b@ public static class SizeLimitExceededException extends FileUploadBase.SizeException@b@ {@b@ private static final long serialVersionUID = -2474893167098052828L;@b@@b@ @Deprecated@b@ public SizeLimitExceededException()@b@ {@b@ this(null, 0L, 0L);@b@ }@b@@b@ @Deprecated@b@ public SizeLimitExceededException(String message)@b@ {@b@ this(message, 0L, 0L);@b@ }@b@@b@ public SizeLimitExceededException(String message, long actual, long permitted)@b@ {@b@ super(message, actual, permitted);@b@ }@b@ }@b@@b@ @Deprecated@b@ public static class UnknownSizeException extends FileUploadException@b@ {@b@ private static final long serialVersionUID = 7062279004812015273L;@b@@b@ public UnknownSizeException()@b@ {@b@ }@b@@b@ public UnknownSizeException(String message)@b@ {@b@ super(message);@b@ }@b@ }@b@@b@ protected static abstract class SizeException extends FileUploadException@b@ {@b@ private static final long serialVersionUID = -8776225574705254126L;@b@ private final long actual;@b@ private final long permitted;@b@@b@ protected SizeException(String message, long actual, long permitted)@b@ {@b@ super(message);@b@ this.actual = actual;@b@ this.permitted = permitted;@b@ }@b@@b@ public long getActualSize()@b@ {@b@ return this.actual;@b@ }@b@@b@ public long getPermittedSize()@b@ {@b@ return this.permitted;@b@ }@b@ }@b@@b@ public static class IOFileUploadException extends FileUploadException@b@ {@b@ private static final long serialVersionUID = 1749796615868477269L;@b@ private final IOException cause;@b@@b@ public IOFileUploadException(String pMsg, IOException pException)@b@ {@b@ super(pMsg);@b@ this.cause = pException;@b@ }@b@@b@ public Throwable getCause()@b@ {@b@ return this.cause;@b@ }@b@ }@b@@b@ public static class InvalidContentTypeException extends FileUploadException@b@ {@b@ private static final long serialVersionUID = -9073026332015646668L;@b@@b@ public InvalidContentTypeException()@b@ {@b@ }@b@@b@ public InvalidContentTypeException(String message)@b@ {@b@ super(message);@b@ }@b@@b@ public InvalidContentTypeException(String msg, Throwable cause)@b@ {@b@ super(msg, cause);@b@ }@b@ }@b@@b@ public static class FileUploadIOException extends IOException@b@ {@b@ private static final long serialVersionUID = -7047616958165584154L;@b@ private final FileUploadException cause;@b@@b@ public FileUploadIOException(FileUploadException pCause)@b@ {@b@ this.cause = pCause;@b@ }@b@@b@ public Throwable getCause()@b@ {@b@ return this.cause;@b@ }@b@ }@b@@b@ private class FileItemIteratorImpl@b@ implements FileItemIterator@b@ {@b@ private final MultipartStream multi;@b@ private final MultipartStream.ProgressNotifier notifier;@b@ private final byte[] boundary;@b@ private FileItemStreamImpl currentItem;@b@ private String currentFieldName;@b@ private boolean skipPreamble;@b@ private boolean itemValid;@b@ private boolean eof;@b@@b@ FileItemIteratorImpl(RequestContext ctx)@b@ throws FileUploadException, IOException@b@ {@b@ if (ctx == null) {@b@ throw new NullPointerException("ctx parameter");@b@ }@b@@b@ String contentType = ctx.getContentType();@b@ if ((null == contentType) || (!(contentType.toLowerCase(Locale.ENGLISH).startsWith("multipart/"))))@b@ {@b@ throw new FileUploadBase.InvalidContentTypeException(String.format("the request doesn't contain a %s or %s stream, content type header is %s", new Object[] { "multipart/form-data", "multipart/mixed", contentType }));@b@ }@b@@b@ InputStream input = ctx.getInputStream();@b@@b@ int contentLengthInt = ctx.getContentLength();@b@@b@ long requestSize = contentLengthInt;@b@@b@ if (FileUploadBase.this.sizeMax >= 0L) {@b@ if ((requestSize != -1L) && (requestSize > FileUploadBase.this.sizeMax)) {@b@ throw new FileUploadBase.SizeLimitExceededException(String.format("the request was rejected because its size (%s) exceeds the configured maximum (%s)", new Object[] { Long.valueOf(requestSize), Long.valueOf(FileUploadBase.access$400(FileUploadBase.this)) }), requestSize, FileUploadBase.this.sizeMax);@b@ }@b@@b@ input = new LimitedInputStream(input, FileUploadBase.this.sizeMax, FileUploadBase.this)@b@ {@b@ protected void raiseError(long pSizeMax, long pCount) throws IOException@b@ {@b@ FileUploadException ex = new FileUploadBase.SizeLimitExceededException(String.format("the request was rejected because its size (%s) exceeds the configured maximum (%s)", new Object[] { Long.valueOf(pCount), Long.valueOf(pSizeMax) }), pCount, pSizeMax);@b@@b@ throw new FileUploadBase.FileUploadIOException(ex);@b@ }@b@ };@b@ }@b@@b@ String charEncoding = FileUploadBase.this.headerEncoding;@b@ if (charEncoding == null) {@b@ charEncoding = ctx.getCharacterEncoding();@b@ }@b@@b@ this.boundary = FileUploadBase.this.getBoundary(contentType);@b@ if (this.boundary == null) {@b@ throw new FileUploadException("the request was rejected because no multipart boundary was found");@b@ }@b@@b@ this.notifier = new MultipartStream.ProgressNotifier(FileUploadBase.this.listener, requestSize);@b@ try {@b@ this.multi = new MultipartStream(input, this.boundary, this.notifier);@b@ } catch (IllegalArgumentException iae) {@b@ throw new FileUploadBase.InvalidContentTypeException(String.format("The boundary specified in the %s header is too long", new Object[] { "Content-type" }), iae);@b@ }@b@@b@ this.multi.setHeaderEncoding(charEncoding);@b@@b@ this.skipPreamble = true;@b@ findNextItem();@b@ }@b@@b@ private boolean findNextItem()@b@ throws IOException@b@ {@b@ if (this.eof) {@b@ return false;@b@ }@b@ if (this.currentItem != null) {@b@ this.currentItem.close();@b@ this.currentItem = null;@b@ }@b@ while (true)@b@ {@b@ boolean nextPart;@b@ if (this.skipPreamble)@b@ nextPart = this.multi.skipPreamble();@b@ else {@b@ nextPart = this.multi.readBoundary();@b@ }@b@ if (!(nextPart)) {@b@ if (this.currentFieldName == null)@b@ {@b@ this.eof = true;@b@ return false;@b@ }@b@@b@ this.multi.setBoundary(this.boundary);@b@ this.currentFieldName = null;@b@ }@b@@b@ FileItemHeaders headers = FileUploadBase.this.getParsedHeaders(this.multi.readHeaders());@b@ if (this.currentFieldName == null)@b@ {@b@ String fieldName = FileUploadBase.this.getFieldName(headers);@b@ if (fieldName != null) {@b@ String subContentType = headers.getHeader("Content-type");@b@ if ((subContentType != null) && (subContentType.toLowerCase(Locale.ENGLISH).startsWith("multipart/mixed")))@b@ {@b@ this.currentFieldName = fieldName;@b@@b@ byte[] subBoundary = FileUploadBase.this.getBoundary(subContentType);@b@ this.multi.setBoundary(subBoundary);@b@ this.skipPreamble = true;@b@ }@b@@b@ String fileName = FileUploadBase.this.getFileName(headers);@b@ this.currentItem = new FileItemStreamImpl(fileName, fieldName, headers.getHeader("Content-type"), fileName == null, getContentLength(headers));@b@@b@ this.currentItem.setHeaders(headers);@b@ this.notifier.noteItem();@b@ this.itemValid = true;@b@ return true;@b@ }@b@ } else {@b@ String fileName = FileUploadBase.this.getFileName(headers);@b@ if (fileName != null) {@b@ this.currentItem = new FileItemStreamImpl(fileName, this.currentFieldName, headers.getHeader("Content-type"), false, getContentLength(headers));@b@@b@ this.currentItem.setHeaders(headers);@b@ this.notifier.noteItem();@b@ this.itemValid = true;@b@ return true;@b@ }@b@ }@b@ this.multi.discardBodyData();@b@ }@b@ }@b@@b@ private long getContentLength(FileItemHeaders pHeaders) {@b@ try {@b@ return Long.parseLong(pHeaders.getHeader("Content-length")); } catch (Exception e) {@b@ }@b@ return -1L;@b@ }@b@@b@ public boolean hasNext()@b@ throws FileUploadException, IOException@b@ {@b@ if (this.eof) {@b@ return false;@b@ }@b@ if (this.itemValid)@b@ return true;@b@ try@b@ {@b@ return findNextItem();@b@ }@b@ catch (FileUploadBase.FileUploadIOException e) {@b@ throw ((FileUploadException)e.getCause());@b@ }@b@ }@b@@b@ public FileItemStream next()@b@ throws FileUploadException, IOException@b@ {@b@ if ((this.eof) || ((!(this.itemValid)) && (!(hasNext())))) {@b@ throw new NoSuchElementException();@b@ }@b@ this.itemValid = false;@b@ return this.currentItem;@b@ }@b@@b@ class FileItemStreamImpl@b@ implements FileItemStream@b@ {@b@ private final String contentType;@b@ private final String fieldName;@b@ private final String name;@b@ private final boolean formField;@b@ private final InputStream stream;@b@ private boolean opened;@b@ private FileItemHeaders headers;@b@@b@ FileItemStreamImpl(String pName, String pFieldName, String pContentType, boolean pFormField, long pContentLength)@b@ throws IOException@b@ {@b@ this.name = pName;@b@ this.fieldName = pFieldName;@b@ this.contentType = pContentType;@b@ this.formField = pFormField;@b@ MultipartStream.ItemInputStream itemStream = FileUploadBase.FileItemIteratorImpl.this.multi.newInputStream();@b@ InputStream istream = itemStream;@b@ if (FileUploadBase.this.fileSizeMax != -1L) {@b@ if ((pContentLength != -1L) && (pContentLength > FileUploadBase.this.fileSizeMax))@b@ {@b@ FileUploadBase.FileSizeLimitExceededException e = new FileUploadBase.FileSizeLimitExceededException(String.format("The field %s exceeds its maximum permitted size of %s bytes.", new Object[] { this.fieldName, Long.valueOf(FileUploadBase.access$200(FileUploadBase.this)) }), pContentLength, FileUploadBase.this.fileSizeMax);@b@@b@ e.setFileName(pName);@b@ e.setFieldName(pFieldName);@b@ throw new FileUploadBase.FileUploadIOException(e);@b@ }@b@ istream = new LimitedInputStream(istream, FileUploadBase.this.fileSizeMax, FileUploadBase.FileItemIteratorImpl.this, itemStream)@b@ {@b@ protected void raiseError(long pSizeMax, long pCount) throws IOException@b@ {@b@ this.val$itemStream.close(true);@b@ FileUploadBase.FileSizeLimitExceededException e = new FileUploadBase.FileSizeLimitExceededException(String.format("The field %s exceeds its maximum permitted size of %s bytes.", new Object[] { FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl.access$300(FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl.this), Long.valueOf(pSizeMax) }), pCount, pSizeMax);@b@@b@ e.setFieldName(FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl.this.fieldName);@b@ e.setFileName(FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl.this.name);@b@ throw new FileUploadBase.FileUploadIOException(e);@b@ }@b@ };@b@ }@b@ this.stream = istream;@b@ }@b@@b@ public String getContentType()@b@ {@b@ return this.contentType;@b@ }@b@@b@ public String getFieldName()@b@ {@b@ return this.fieldName;@b@ }@b@@b@ public String getName()@b@ {@b@ return Streams.checkFileName(this.name);@b@ }@b@@b@ public boolean isFormField()@b@ {@b@ return this.formField;@b@ }@b@@b@ public InputStream openStream()@b@ throws IOException@b@ {@b@ if (this.opened) {@b@ throw new IllegalStateException("The stream was already opened.");@b@ }@b@@b@ if (((Closeable)this.stream).isClosed()) {@b@ throw new FileItemStream.ItemSkippedException();@b@ }@b@ return this.stream;@b@ }@b@@b@ void close()@b@ throws IOException@b@ {@b@ this.stream.close();@b@ }@b@@b@ public FileItemHeaders getHeaders()@b@ {@b@ return this.headers;@b@ }@b@@b@ public void setHeaders(FileItemHeaders pHeaders)@b@ {@b@ this.headers = pHeaders;@b@ }@b@ }@b@ }@b@}
2.ServletFileUpload
package org.apache.commons.fileupload.servlet;@b@@b@import java.io.IOException;@b@import java.util.List;@b@import java.util.Map;@b@import javax.servlet.http.HttpServletRequest;@b@import org.apache.commons.fileupload.FileItem;@b@import org.apache.commons.fileupload.FileItemFactory;@b@import org.apache.commons.fileupload.FileItemIterator;@b@import org.apache.commons.fileupload.FileUpload;@b@import org.apache.commons.fileupload.FileUploadBase;@b@import org.apache.commons.fileupload.FileUploadException;@b@@b@public class ServletFileUpload extends FileUpload@b@{@b@ private static final String POST_METHOD = "POST";@b@@b@ public static final boolean isMultipartContent(HttpServletRequest request)@b@ {@b@ if (!("POST".equalsIgnoreCase(request.getMethod()))) {@b@ return false;@b@ }@b@ return FileUploadBase.isMultipartContent(new ServletRequestContext(request));@b@ }@b@@b@ public ServletFileUpload()@b@ {@b@ }@b@@b@ public ServletFileUpload(FileItemFactory fileItemFactory)@b@ {@b@ super(fileItemFactory);@b@ }@b@@b@ public List<FileItem> parseRequest(HttpServletRequest request)@b@ throws FileUploadException@b@ {@b@ return parseRequest(new ServletRequestContext(request));@b@ }@b@@b@ public Map<String, List<FileItem>> parseParameterMap(HttpServletRequest request)@b@ throws FileUploadException@b@ {@b@ return parseParameterMap(new ServletRequestContext(request));@b@ }@b@@b@ public FileItemIterator getItemIterator(HttpServletRequest request)@b@ throws FileUploadException, IOException@b@ {@b@ return super.getItemIterator(new ServletRequestContext(request));@b@ }@b@}
3.Streams
package org.apache.commons.fileupload.util;@b@@b@import java.io.ByteArrayOutputStream;@b@import java.io.IOException;@b@import java.io.InputStream;@b@import java.io.OutputStream;@b@import org.apache.commons.fileupload.InvalidFileNameException;@b@import org.apache.commons.io.IOUtils;@b@@b@public final class Streams@b@{@b@ private static final int DEFAULT_BUFFER_SIZE = 8192;@b@@b@ public static long copy(InputStream inputStream, OutputStream outputStream, boolean closeOutputStream)@b@ throws IOException@b@ {@b@ return copy(inputStream, outputStream, closeOutputStream, new byte[8192]);@b@ }@b@@b@ public static long copy(InputStream inputStream, OutputStream outputStream, boolean closeOutputStream, byte[] buffer)@b@ throws IOException@b@ {@b@ OutputStream out = outputStream;@b@ InputStream in = inputStream;@b@ try {@b@ long total = 0L;@b@ while (true) {@b@ res = in.read(buffer);@b@ if (res == -1) {@b@ break;@b@ }@b@ if (res > 0) {@b@ total += res;@b@ if (out != null) {@b@ out.write(buffer, 0, res);@b@ }@b@ }@b@ }@b@ if (out != null) {@b@ if (closeOutputStream)@b@ out.close();@b@ else {@b@ out.flush();@b@ }@b@ out = null;@b@ }@b@ in.close();@b@ in = null;@b@ int res = total;@b@@b@ return res;@b@ }@b@ finally@b@ {@b@ IOUtils.closeQuietly(in);@b@ if (closeOutputStream)@b@ IOUtils.closeQuietly(out);@b@ }@b@ }@b@@b@ public static String asString(InputStream inputStream)@b@ throws IOException@b@ {@b@ ByteArrayOutputStream baos = new ByteArrayOutputStream();@b@ copy(inputStream, baos, true);@b@ return baos.toString();@b@ }@b@@b@ public static String asString(InputStream inputStream, String encoding)@b@ throws IOException@b@ {@b@ ByteArrayOutputStream baos = new ByteArrayOutputStream();@b@ copy(inputStream, baos, true);@b@ return baos.toString(encoding);@b@ }@b@@b@ public static String checkFileName(String fileName)@b@ {@b@ if ((fileName != null) && (fileName.indexOf(0) != -1))@b@ {@b@ StringBuilder sb = new StringBuilder();@b@ for (int i = 0; i < fileName.length(); ++i) {@b@ char c = fileName.charAt(i);@b@ switch (c)@b@ {@b@ case '\0':@b@ sb.append("\\0");@b@ break;@b@ default:@b@ sb.append(c);@b@ }@b@ }@b@@b@ throw new InvalidFileNameException(fileName, "Invalid file name: " + sb);@b@ }@b@@b@ return fileName;@b@ }@b@}