multipartrequest.java

来自「很好的文件处理程序」· Java 代码 · 共 490 行 · 第 1/2 页

JAVA
490
字号
// Copyright (C) 1998-2001 by Jason Hunter <jhunter_AT_acm_DOT_org>.// All rights reserved.  Use of this class is limited.// Please see the LICENSE for more information.package com.oreilly.servlet;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import com.oreilly.servlet.multipart.MultipartParser;import com.oreilly.servlet.multipart.Part;import com.oreilly.servlet.multipart.FilePart;import com.oreilly.servlet.multipart.ParamPart;import com.oreilly.servlet.multipart.FileRenamePolicy;/**  * A utility class to handle <code>multipart/form-data</code> requests, * the kind of requests that support file uploads.  This class emulates the  * interface of <code>HttpServletRequest</code>, making it familiar to use.  * It uses a "push" model where any incoming files are read and saved directly * to disk in the constructor. If you wish to have more flexibility, e.g.  * write the files to a database, use the "pull" model  * <code>MultipartParser</code> instead. * <p> * This class can receive arbitrarily large files (up to an artificial limit  * you can set), and fairly efficiently too.   * It cannot handle nested data (multipart content within multipart content). * It <b>can</b> now with the latest release handle internationalized content * (such as non Latin-1 filenames). * <p> * To avoid collisions and have fine control over file placement, there's a * constructor variety that takes a pluggable FileRenamePolicy implementation. * A particular policy can choose to rename or change the location of the file * before it's written. * <p> * See the included upload.war for an example of how to use this class. * <p> * The full file upload specification is contained in experimental RFC 1867, * available at <a href="http://www.ietf.org/rfc/rfc1867.txt"> * http://www.ietf.org/rfc/rfc1867.txt</a>. * * @see MultipartParser *  * @author Jason Hunter * @author Geoff Soutter * @version 1.11, 2002/11/01, combine query string params in param list<br> * @version 1.10, 2002/05/27, added access to the original file names<br> * @version 1.9, 2002/04/30, added support for file renaming, thanks to *                           Changshin Lee<br> * @version 1.8, 2002/04/30, added support for internationalization, thanks to *                           Changshin Lee<br> * @version 1.7, 2001/02/07, made fields protected to increase user flexibility<br> * @version 1.6, 2000/07/21, redid internals to use MultipartParser, *                           thanks to Geoff Soutter<br> * @version 1.5, 2000/02/04, added auto MacBinary decoding for IE on Mac<br> * @version 1.4, 2000/01/05, added getParameterValues(), *                           WebSphere 2.x getContentType() workaround, *                           stopped writing empty "unknown" file<br> * @version 1.3, 1999/12/28, IE4 on Win98 lastIndexOf("boundary=") * workaround<br> * @version 1.2, 1999/12/20, IE4 on Mac readNextPart() workaround<br> * @version 1.1, 1999/01/15, JSDK readLine() bug workaround<br> * @version 1.0, 1998/09/18<br> */public class MultipartRequest {  private static final int DEFAULT_MAX_POST_SIZE = 1024 * 1024;  // 1 Meg  protected Hashtable parameters = new Hashtable();  // name - Vector of values  protected Hashtable files = new Hashtable();       // name - UploadedFile  /**   * Constructs a new MultipartRequest to handle the specified request,    * saving any uploaded files to the given directory, and limiting the    * upload size to 1 Megabyte.  If the content is too large, an   * IOException is thrown.  This constructor actually parses the    * <tt>multipart/form-data</tt> and throws an IOException if there's any    * problem reading or parsing the request.   *   * @param request the servlet request.   * @param saveDirectory the directory in which to save any uploaded files.   * @exception IOException if the uploaded content is larger than 1 Megabyte   * or there's a problem reading or parsing the request.   */  public MultipartRequest(HttpServletRequest request,                          String saveDirectory) throws IOException {    this(request, saveDirectory, DEFAULT_MAX_POST_SIZE);  }  /**   * Constructs a new MultipartRequest to handle the specified request,    * saving any uploaded files to the given directory, and limiting the    * upload size to the specified length.  If the content is too large, an    * IOException is thrown.  This constructor actually parses the    * <tt>multipart/form-data</tt> and throws an IOException if there's any    * problem reading or parsing the request.   *   * @param request the servlet request.   * @param saveDirectory the directory in which to save any uploaded files.   * @param maxPostSize the maximum size of the POST content.   * @exception IOException if the uploaded content is larger than    * <tt>maxPostSize</tt> or there's a problem reading or parsing the request.   */  public MultipartRequest(HttpServletRequest request,                          String saveDirectory,                          int maxPostSize) throws IOException {    this(request, saveDirectory, maxPostSize, null, null);  }  /**   * Constructs a new MultipartRequest to handle the specified request,    * saving any uploaded files to the given directory, and limiting the    * upload size to the specified length.  If the content is too large, an    * IOException is thrown.  This constructor actually parses the    * <tt>multipart/form-data</tt> and throws an IOException if there's any    * problem reading or parsing the request.   *   * @param request the servlet request.   * @param saveDirectory the directory in which to save any uploaded files.   * @param encoding the encoding of the response, such as ISO-8859-1   * @exception IOException if the uploaded content is larger than    * 1 Megabyte or there's a problem reading or parsing the request.   */  public MultipartRequest(HttpServletRequest request,                          String saveDirectory,                          String encoding) throws IOException {    this(request, saveDirectory, DEFAULT_MAX_POST_SIZE, encoding, null);  }  /**   * Constructs a new MultipartRequest to handle the specified request,    * saving any uploaded files to the given directory, and limiting the    * upload size to the specified length.  If the content is too large, an    * IOException is thrown.  This constructor actually parses the    * <tt>multipart/form-data</tt> and throws an IOException if there's any    * problem reading or parsing the request.   *   * @param request the servlet request.   * @param saveDirectory the directory in which to save any uploaded files.   * @param maxPostSize the maximum size of the POST content.   * @param encoding the encoding of the response, such as ISO-8859-1   * @exception IOException if the uploaded content is larger than    * <tt>maxPostSize</tt> or there's a problem reading or parsing the request.   */  public MultipartRequest(HttpServletRequest request,                          String saveDirectory,                          int maxPostSize,                          FileRenamePolicy policy) throws IOException {    this(request, saveDirectory, maxPostSize, null, policy);  }  /**   * Constructs a new MultipartRequest to handle the specified request,    * saving any uploaded files to the given directory, and limiting the    * upload size to the specified length.  If the content is too large, an    * IOException is thrown.  This constructor actually parses the    * <tt>multipart/form-data</tt> and throws an IOException if there's any    * problem reading or parsing the request.   *   * @param request the servlet request.   * @param saveDirectory the directory in which to save any uploaded files.   * @param maxPostSize the maximum size of the POST content.   * @param encoding the encoding of the response, such as ISO-8859-1   * @exception IOException if the uploaded content is larger than    * <tt>maxPostSize</tt> or there's a problem reading or parsing the request.   */  public MultipartRequest(HttpServletRequest request,                          String saveDirectory,                          int maxPostSize,                          String encoding) throws IOException {    this(request, saveDirectory, maxPostSize, encoding, null);  }  /**   * Constructs a new MultipartRequest to handle the specified request,    * saving any uploaded files to the given directory, and limiting the    * upload size to the specified length.  If the content is too large, an    * IOException is thrown.  This constructor actually parses the    * <tt>multipart/form-data</tt> and throws an IOException if there's any    * problem reading or parsing the request.   *   * To avoid file collisions, this constructor takes an implementation of the   * FileRenamePolicy interface to allow a pluggable rename policy.   *   * @param request the servlet request.   * @param saveDirectory the directory in which to save any uploaded files.   * @param maxPostSize the maximum size of the POST content.   * @param encoding the encoding of the response, such as ISO-8859-1   * @param policy a pluggable file rename policy   * @exception IOException if the uploaded content is larger than    * <tt>maxPostSize</tt> or there's a problem reading or parsing the request.   */  public MultipartRequest(HttpServletRequest request,                          String saveDirectory,                          int maxPostSize,                          String encoding,                          FileRenamePolicy policy) throws IOException {    // Sanity check values    if (request == null)      throw new IllegalArgumentException("request cannot be null");    if (saveDirectory == null)      throw new IllegalArgumentException("saveDirectory cannot be null");    if (maxPostSize <= 0) {      throw new IllegalArgumentException("maxPostSize must be positive");    }    // Save the dir    File dir = new File(saveDirectory);    // Check saveDirectory is truly a directory    if (!dir.isDirectory())      throw new IllegalArgumentException("Not a directory: " + saveDirectory);    // Check saveDirectory is writable    if (!dir.canWrite())      throw new IllegalArgumentException("Not writable: " + saveDirectory);    // Parse the incoming multipart, storing files in the dir provided,     // and populate the meta objects which describe what we found    MultipartParser parser =      new MultipartParser(request, maxPostSize, true, true, encoding);    // Some people like to fetch query string parameters from    // MultipartRequest, so here we make that possible.  Thanks to     // Ben Johnson, ben.johnson@merrillcorp.com, for the idea.    if (request.getQueryString() != null) {      // Let HttpUtils create a name->String[] structure      Hashtable queryParameters =        HttpUtils.parseQueryString(request.getQueryString());      // For our own use, name it a name->Vector structure      Enumeration queryParameterNames = queryParameters.keys();      while (queryParameterNames.hasMoreElements()) {        Object paramName = queryParameterNames.nextElement();        String[] values = (String[])queryParameters.get(paramName);        Vector newValues = new Vector();        for (int i = 0; i < values.length; i++) {          newValues.add(values[i]);        }        parameters.put(paramName, newValues);      }    }    Part part;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?