📄 fileuploadbase.java
字号:
{ multi.readBodyData(os); } finally { os.close(); } } } else { // Skip this part. multi.discardBodyData(); } nextPart = multi.readBoundary(); } } catch (IOException e) { for(int i=0;i<items.size();i++) { FileItem item = (FileItem)items.get(i); item.delete(); } throw new FileUploadException("Processing of " + MULTIPART_FORM_DATA + " request failed. " + e.getMessage(), e); } return items; } // ------------------------------------------------------ Protected methods /** * Retrieves the boundary from the <code>Content-type</code> header. * * @param contentType * The value of the content type header from which to extract the boundary value. * * @return The boundary, as a byte array. */ protected byte[] getBoundary(String contentType) { ParameterParser parser = new ParameterParser(); parser.setLowerCaseNames(true); // Parameter parser can handle null input Map params = parser.parse(contentType, ';'); String boundaryStr = (String)params.get("boundary"); if (boundaryStr == null) { return null; } byte[] boundary; try { boundary = boundaryStr.getBytes("ISO-8859-1"); } catch (UnsupportedEncodingException e) { boundary = boundaryStr.getBytes(); } return boundary; } /** * Retrieves the file name from the <code>Content-disposition</code> header. * * @param headers * A <code>Map</code> containing the HTTP request headers. * * @return The file name for the current <code>encapsulation</code>. */ protected String getFileName(Map /* String, String */headers) { String fileName = null; String cd = getHeader(headers, CONTENT_DISPOSITION); if (cd.startsWith(FORM_DATA) || cd.startsWith(ATTACHMENT)) { ParameterParser parser = new ParameterParser(); parser.setLowerCaseNames(true); // Parameter parser can handle null input Map params = parser.parse(cd, ';'); if (params.containsKey("filename")) { fileName = (String)params.get("filename"); if (fileName != null) { fileName = fileName.trim(); int index = fileName.lastIndexOf('\\'); if (index == -1) { index = fileName.lastIndexOf('/'); } if (index != -1) { fileName = fileName.substring(index + 1); } } else { // Even if there is no value, the parameter is present, so // we return an empty file name rather than no file name. fileName = ""; } } } return fileName; } /** * Retrieves the field name from the <code>Content-disposition</code> header. * * @param headers * A <code>Map</code> containing the HTTP request headers. * * @return The field name for the current <code>encapsulation</code>. */ protected String getFieldName(Map /* String, String */headers) { String fieldName = null; String cd = getHeader(headers, CONTENT_DISPOSITION); if (cd != null && cd.startsWith(FORM_DATA)) { ParameterParser parser = new ParameterParser(); parser.setLowerCaseNames(true); // Parameter parser can handle null input Map params = parser.parse(cd, ';'); fieldName = (String)params.get("name"); if (fieldName != null) { fieldName = fieldName.trim(); } } return fieldName; } /** * Creates a new {@link FileItem} instance. * * @param headers * A <code>Map</code> containing the HTTP request headers. * @param isFormField * Whether or not this item is a form field, as opposed to a file. * * @return A newly created <code>FileItem</code> instance. */ protected FileItem createItem(Map /* String, String */headers, boolean isFormField) { return getFileItemFactory().createItem(getFieldName(headers), getHeader(headers, CONTENT_TYPE), isFormField, getFileName(headers)); } /** * <p> * Parses the <code>header-part</code> and returns as key/value pairs. * * <p> * If there are multiple headers of the same names, the name will map to a comma-separated list * containing the values. * * @param headerPart * The <code>header-part</code> of the current <code>encapsulation</code>. * * @return A <code>Map</code> containing the parsed HTTP request headers. */ protected Map /* String, String */parseHeaders(String headerPart) { Map headers = new HashMap(); char[] buffer = new char[MAX_HEADER_SIZE]; boolean done = false; int j = 0; int i; String header, headerName, headerValue; try { while (!done) { i = 0; // Copy a single line of characters into the buffer, // omitting trailing CRLF. while (i < 2 || buffer[i - 2] != '\r' || buffer[i - 1] != '\n') { buffer[i++] = headerPart.charAt(j++); } header = new String(buffer, 0, i - 2); if (header.equals("")) { done = true; } else { if (header.indexOf(':') == -1) { // This header line is malformed, skip it. continue; } headerName = header.substring(0, header.indexOf(':')).trim().toLowerCase(); headerValue = header.substring(header.indexOf(':') + 1).trim(); if (getHeader(headers, headerName) != null) { // More that one header of that name exists, // append to the list. headers.put(headerName, getHeader(headers, headerName) + ',' + headerValue); } else { headers.put(headerName, headerValue); } } } } catch (IndexOutOfBoundsException e) { // Headers were malformed. continue with all that was // parsed. } return headers; } /** * Returns the header with the specified name from the supplied map. The header lookup is * case-insensitive. * * @param headers * A <code>Map</code> containing the HTTP request headers. * @param name * The name of the header to return. * * @return The value of specified header, or a comma-separated list if there were multiple * headers of that name. */ protected final String getHeader(Map /* String, String */headers, String name) { return (String)headers.get(name.toLowerCase()); } /** * Thrown to indicate that the request is not a multipart request. */ public static class InvalidContentTypeException extends FileUploadException { private static final long serialVersionUID = 1L; /** * Constructs a <code>InvalidContentTypeException</code> with no detail message. */ public InvalidContentTypeException() { super(); } /** * Constructs an <code>InvalidContentTypeException</code> with the specified detail * message. * * @param message * The detail message. */ public InvalidContentTypeException(String message) { super(message); } } /** * Thrown to indicate that the request size is not specified. */ public static class UnknownSizeException extends FileUploadException { private static final long serialVersionUID = 1L; /** * Constructs a <code>UnknownSizeException</code> with no detail message. */ public UnknownSizeException() { super(); } /** * Constructs an <code>UnknownSizeException</code> with the specified detail message. * * @param message * The detail message. */ public UnknownSizeException(String message) { super(message); } } /** * Thrown to indicate that the request size exceeds the configured maximum. */ public static class SizeLimitExceededException extends FileUploadException { private static final long serialVersionUID = 1L; /** * Constructs a <code>SizeExceededException</code> with no detail message. */ public SizeLimitExceededException() { super(); } /** * Constructs an <code>SizeExceededException</code> with the specified detail message. * * @param message * The detail message. */ public SizeLimitExceededException(String message) { super(message); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -