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 + -
显示快捷键?