当前位置:  技术问答>java相关

非常着急的我,关于input…………………………………………

    来源: 互联网  发布时间:2014-12-23

    本文导语:  请问用提交的表单怎么处理?用Jsp写能直接存到指定路径下吗? 能不能给小弟一个例子?谢谢了先。 | 先给你这个类 multipartrequest.java //------------------------------------------------------ /*      * A utility c...

请问用提交的表单怎么处理?用Jsp写能直接存到指定路径下吗?
能不能给小弟一个例子?谢谢了先。

|

先给你这个类 multipartrequest.java

//------------------------------------------------------

/* 
  
 * A utility class to handle multipart/form-data requests, 
 * the kind of requests that support file uploads.  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 co 
ntent) 
 * or internationalized content (such as non Latin-1 filenames). 
 * 

 
 * It's used like this: 
 * 

 
  
 *指定上传文件最大字节 
 * MultipartRequest multi = new MultipartRequest(req, ".", 2*1024); 
 或使用默认2M, 
  MultipartRequest multi = new MultipartRequest(req, "."); 
 *   
 * out.println("Params:"); 
 * Enumeration params = multi.getParameterNames(); 
 * while (params.hasMoreElements()) { 
 *   String name = (String)params.nextElement(); 
 *   String value = multi.getParameter(name); 
 *   out.println(name + " = " + value); 
 * } 
 * out.println(); 
 *   
 * out.println("Files:"); 
 * Enumeration files = multi.getFileNames(); 
 * while (files.hasMoreElements()) { 
 *   String name = (String)files.nextElement(); 
 *   String filename = multi.getFilesystemName(name); 
 *   String type = multi.getContentType(name); 
 *   File f = multi.getFile(name); 
 *   out.println("name: " + name); 
 *   out.println("filename: " + filename); 
 *   out.println("type: " + type); 
 *   if (f != null) { 
 *     out.println("f.toString(): " + f.toString()); 
 *     out.println("f.getName(): " + f.getName()); 
 *     out.println("f.exists(): " + f.exists()); 
 *     out.println("f.length(): " + f.length()); 
 *     out.println(); 
 *   } 
 * } 
 * 
 
 * 
 * A client can upload files using an HTML form with the following str 
ucture. 
 * Note that not all browsers support file uploads. 
 * 
 
 *  
 * What is your name?  
 

 * Which file to upload?  
 

 *  
 *  
 * 
 
 * 

 

*/ 

import java.io.*; 
import java.util.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 

public class MultipartRequest { 

  private static final int DEFAULT_MAX_POST_SIZE = 1024 * 1024;  // 1Meg 
  private static final String NO_FILE = "unknown"; 

  private HttpServletRequest req; 
  private File dir; 
  private int maxSize; 

  private Hashtable parameters = new Hashtable();  // name - Vector of values 
  private 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  
   * multipart/form-data 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  
   * multipart/form-data 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  
   * maxPostSize or there's a problem reading or parsing the request 
   */ 
   
  public MultipartRequest(HttpServletRequest request,String saveDirectory,int maxPostSize) 
   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  type2.length() ? type1 : type2); 
    } 

    if (type == null || !type.toLowerCase().startsWith("multipart/form-data")) { 
      throw new IOException("Posted content type isn't multipart/form-data"); 
    } 

    // Get the boundary string; it's included in the content type. 
    // Should look something like "------------------------12012133613061" 
    
    String boundary = extractBoundary(type); 
    if (boundary == null) { 
      throw new IOException("Separation boundary was not specified"); 

    } 

    // Construct the special input stream we'll read from 
    MultipartInputStreamHandler in = 
      new MultipartInputStreamHandler(req.getInputStream(), length); 

    // Read the first line, should be the first boundary 
    String line = in.readLine(); 
    if (line == null) { 
      throw new IOException("Corrupt form data: premature ending"); 
    } 

    // Verify that the line is the boundary 
    if (!line.startsWith(boundary)) { 
      throw new IOException("Corrupt form data: no leading boundary"); 

    } 

    // Now that we're just beyond the first boundary, loop over each part 
    boolean done = false; 
    while (!done) { 
      done = readNextPart(in, boundary); 
    } 
  } 

  /** 
   * A utility method that reads an individual part.  Dispatches to  
   * readParameter() and readAndSaveFile() to do the actual work.  A  
   * subclass can override this method for a better optimized or  
   * differently behaved implementation. 
   *  
   * @param in the stream from which to read the part 
   * @param boundary the boundary separating parts 
   * @return a flag indicating whether this is the last part 
   * @exception IOException if there's a problem reading or parsing the 
   * request 
   * 
   * @see readParameter 
   * @see readAndSaveFile 
   */ 
  protected boolean readNextPart(MultipartInputStreamHandler in, 
                                 String boundary) throws IOException { 

    // Read the first line, should look like this: 
    // content-disposition: form-data; name="field1"; filename="file1.txt" 
    String line = in.readLine(); 
    if (line == null) { 
      // No parts left, we're done 
      return true; 
    } 
    else if (line.length() == 0) { 
      // IE4 on Mac sends an empty line at the end; treat that as the end. 
      // Thanks to Daniel Lemire and Henri Tourigny for this fix. 
      return true; 
    } 

    // Parse the content-disposition line 
    String[] dispInfo = extractDispositionInfo(line); 
    String disposition = dispInfo[0]; 
    String name = dispInfo[1]; 
    String filename = dispInfo[2]; 

    // Now onto the next line.  This will either be empty  
    // or contain a Content-Type and then an empty line. 
    line = in.readLine(); 
    if (line == null) { 
      // No parts left, we're done 
      return true; 
    } 

    // Get the content type, or null if none specified 
    String contentType = extractContentType(line); 
    if (contentType != null) { 
      // Eat the empty line 
      line = in.readLine(); 
      if (line == null || line.length() > 0) {  // line should be empty 
        throw new  
          IOException("Malformed line after content type: " + line); 
      } 
    } 
    else { 
      // Assume a default content type 
      contentType = "application/octet-stream"; 
    } 

    // Now, finally, we read the content (end after reading the boundary) 
    if (filename == null) { 
      // This is a parameter, add it to the vector of values 
      String value = readParameter(in, boundary); 
      if (value.equals("")) { 
        value = null;  // treat empty strings like nulls 
      } 
      Vector existingValues = (Vector)parameters.get(name); 
      if (existingValues == null) { 
        existingValues = new Vector(); 
        parameters.put(name, existingValues); 
      } 
      existingValues.addElement(value); 
    } 
    else { 
      // This is a file 
      readAndSaveFile(in, boundary, filename, contentType); 
      if (filename.equals(NO_FILE)) { 
        files.put(name, new UploadedFile(null, null, null)); 
      } 
      else { 
        files.put(name, 
          new UploadedFile(dir.toString(), filename, contentType)); 
      } 
    } 
    return false;  // there's more to read 
  } 

  /** 
   * A utility method that reads a single part of the multipart request  
   * that represents a parameter.  A subclass can override this method 
   * for a better optimized or differently behaved implementation. 
   * 
   * @param in the stream from which to read the parameter information 

   * @param boundary the boundary signifying the end of this part 
   * @return the parameter value 
   * @exception IOException if there's a problem reading or parsing the  
   * request 
   */ 
  protected String readParameter(MultipartInputStreamHandler in, 
                                 String boundary) throws IOException { 

    StringBuffer sbuf = new StringBuffer(); 
    String line; 

    while ((line = in.readLine()) != null) { 
      if (line.startsWith(boundary)) break; 
      sbuf.append(line + "rn");  // add the rn in case there are many lines 
    } 

    if (sbuf.length() == 0) { 
      return null;  // nothing read 
    } 

    sbuf.setLength(sbuf.length() - 2);  // cut off the last line's rn 
    return sbuf.toString();  // no URL decoding needed 
  } 

  /** 
   * A utility method that reads a single part of the multipart request  
   * that represents a file, and saves the file to the given directory. 
   * A subclass can override this method for a better optimized or  
   * differently behaved implementation. 
   * 
   * @param in the stream from which to read the file 
   * @param boundary the boundary signifying the end of this part 
   * @param dir the directory in which to save the uploaded file 
   * @param filename the name under which to save the uploaded file 
   * @exception IOException if there's a problem reading or parsing the  
   * request 
   */ 
  protected void readAndSaveFile(MultipartInputStreamHandler in, 
                                 String boundary, 
                                 String filename, 
                                 String contentType) throws IOException { 
    OutputStream out = null; 
    // A filename of NO_FILE means no file was sent, so just read to the 
    // next boundary and ignore the empty contents 
    if (filename.equals(NO_FILE)) { 
      out = new ByteArrayOutputStream();  // write to nowhere 
    } 
    // A MacBinary file goes through a decoder 
    else if (contentType.equals("application/x-macbinary")){ 
      File f = new File(dir + File.separator + filename); 
      out = new MacBinaryDecoderOutputStream( 
            new BufferedOutputStream( 
            new FileOutputStream(f), 8 * 1024)); 
    } 
    // A real file's contents are written to disk 
    else { 
      File f = new File(dir + File.separator + filename); 
      out = new BufferedOutputStream(new FileOutputStream(f), 8 * 1024 
); 
    } 

    byte[] bbuf = new byte[100 * 1024];  // 100K 
    int result; 
    String line; 

    // ServletInputStream.readLine() has the annoying habit of  
    // adding a rn to the end of the last line.   
    // Since we want a byte-for-byte transfer, we have to cut those chars. 
    boolean rnflag = false; 
    while ((result = in.readLine(bbuf, 0, bbuf.length)) != -1) { 
      // Check for boundary 
      if (result > 2 && bbuf[0] == '-' && bbuf[1] == '-') { // quick pre-check 
        line = new String(bbuf, 0, result, "ISO-8859-1"); 
        if (line.startsWith(boundary)) break; 
      } 
      // Are we supposed to write rn for the last iteration? 
      if (rnflag) { 
        out.write('r'); out.write('n'); 
        rnflag = false; 
      } 
      // Write the buffer, postpone any ending rn 
      if (result >= 2 &&  
          bbuf[result - 2] == 'r' &&  
          bbuf[result - 1] == 'n') { 
        out.write(bbuf, 0, result - 2);  // skip the last 2 chars 
        rnflag = true;  // make a note to write them on the next iteration 
      } 
      else { 
        out.write(bbuf, 0, result); 
      } 
    } 
    out.flush(); 
    out.close(); 
  } 

  // Extracts and returns the boundary token from a line. 
  // 
  private String extractBoundary(String line) { 
    // Use lastIndexOf() because IE 4.01 on Win98 has been known to send the 
    // "boundary=" string multiple times.  Thanks to David Wall for this fix. 
    int index = line.lastIndexOf("boundary="); 
    if (index == -1) { 
      return null; 
    } 
    String boundary = line.substring(index + 9);  // 9 for "boundary=" 


    // The real boundary is always preceeded by an extra "--" 
    boundary = "--" + boundary; 

    return boundary; 
  } 

  // Extracts and returns disposition info from a line, as a String array 
  // with elements: disposition, name, filename.  Throws an IOException  
  // if the line is malformatted. 
  // 
  private String[] extractDispositionInfo(String line) throws IOException { 
    // Return the line's data as an array: disposition, name, filename 

    String[] retval = new String[3]; 

    // Convert the line to a lowercase string without the ending rn 

    // Keep the original line for error messages and for variable names. 
    String origline = line; 
    line = origline.toLowerCase(); 

    // Get the content disposition, should be "form-data" 
    int start = line.indexOf("content-disposition: "); 
    int end = line.indexOf(";"); 
    if (start == -1 || end == -1) { 
      throw new IOException("Content disposition corrupt: " + origline 
); 
    } 
    String disposition = line.substring(start + 21, end); 
    if (!disposition.equals("form-data")) { 
      throw new IOException("Invalid content disposition: " + disposition); 
    } 

    // Get the field name 
    start = line.indexOf("name="", end);  // start at last semicolon 

    end = line.indexOf(""", start + 7);   // skip name=" 
    if (start == -1 || end == -1) { 
      throw new IOException("Content disposition corrupt: " + origline); 
    } 
    String name = origline.substring(start + 6, end); 

    // Get the filename, if given 
    String filename = null; 
    start = line.indexOf("filename="", end + 2);  // start after name 

    end = line.indexOf(""", start + 10);          // skip filename=" 

    if (start != -1 && end != -1) {                // note the != 
      filename = origline.substring(start + 10, end); 
      // The filename may contain a full path.  Cut to just the filename. 
      int slash = 
        Math.max(filename.lastIndexOf('/'), filename.lastIndexOf('\')); 
      if (slash > -1) { 
        filename = filename.substring(slash + 1);  // past last slash 
      } 
      if (filename.equals("")) filename = NO_FILE; // sanity check 
    } 

    // Return a String array: disposition, name, filename 
    retval[0] = disposition; 
    retval[1] = name; 
    retval[2] = filename; 
    return retval; 
  } 

  // Extracts and returns the content type from a line, or null if the 

  // line was empty.  Throws an IOException if the line is malformatted. 
  // 
  private String extractContentType(String line) throws IOException { 

    String contentType = null; 

    // Convert the line to a lowercase string 
    String origline = line; 
    line = origline.toLowerCase(); 

    // Get the content type, if any 
    if (line.startsWith("content-type")) { 
      int start = line.indexOf(" "); 
      if (start == -1) { 
        throw new IOException("Content type corrupt: " + origline); 
      } 
      contentType = line.substring(start + 1); 
    } 
    else if (line.length() != 0) {  // no content type, so should be empty 
      throw new IOException("Malformed line after disposition: " + origline); 
    } 

    return contentType; 
  } 



// A class to hold information about an uploaded file. 
// 
class UploadedFile { 

  private String dir; 
  private String filename; 
  private String type; 

  UploadedFile(String dir, String filename, String type) { 
    this.dir = dir; 
    this.filename = filename; 
    this.type = type; 
  } 

  public String getContentType() { 
    return type; 
  } 

  public String getFilesystemName() { 
    return filename; 
  } 

  public File getFile() { 
    if (dir == null || filename == null) { 
      return null; 
    } 
    else { 
      return new File(dir + File.separator + filename); 
    } 
  } 



// A class to aid in reading multipart/form-data from a ServletInputStream. 
// It keeps track of how many bytes have been read and detects when the 
// Content-Length limit has been reached.  This is necessary since some  
// servlet engines are slow to notice the end of stream. 
// 
// Mac users: The Mac doesn't like class names which exceed 32 characters 
// (including the ".class") so while this class is usable from a JAR  
// anywhere, it won't compile on a Mac. 
// 

class MultipartInputStreamHandler { 

  ServletInputStream in; 
  int totalExpected; 
  int totalRead = 0; 
  byte[] buf = new byte[8 * 1024]; 

  public MultipartInputStreamHandler(ServletInputStream in, 
                                     int totalExpected) { 
    this.in = in; 
    this.totalExpected = totalExpected; 
  } 

  // Reads the next line of input.  Returns null to indicate the end 
  // of stream. 
  // 
  public String readLine() throws IOException { 
    StringBuffer sbuf = new StringBuffer(); 
    int result; 
    String line; 

    do { 
      result = this.readLine(buf, 0, buf.length);  // this.readLine() does += 
      if (result != -1) { 
        sbuf.append(new String(buf, 0, result, "ISO-8859-1")); 
      } 
    } while (result == buf.length);  // loop only if the buffer was filled 

    if (sbuf.length() == 0) { 
      return null;  // nothing read, must be at the end of stream 
    } 

    sbuf.setLength(sbuf.length() - 2);  // cut off the trailing rn 
    return sbuf.toString(); 
  } 

  // A pass-through to ServletInputStream.readLine() that keeps track 
  // of how many bytes have been read and stops reading when the  
  // Content-Length limit has been reached. 
  // 
  public int readLine(byte b[], int off, int len) throws IOException { 

    if (totalRead >= totalExpected) { 
      return -1; 
    } 
    else { 
      if (len > (totalExpected - totalRead)) { 
        len = totalExpected - totalRead;  // keep from reading off end 
      } 
      int result = in.readLine(b, off, len); 
      if (result > 0) { 
        totalRead += result; 
      } 
      return result; 
    } 
  } 



// Class to filters MacBinary files to normal files on the fly 
// Optimized for speed more than readability 
class MacBinaryDecoderOutputStream extends FilterOutputStream { 

  int bytesFiltered = 0; 
  int dataForkLength = 0; 

  public MacBinaryDecoderOutputStream(OutputStream out) { 
    super(out); 
  } 

  public void write(int b) throws IOException { 
    // Bytes 83 through 86 are a long representing the data fork length 
    // Check 


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.imageio类imagereader的类成员方法: input定义及介绍
  • jquery中$(#form :input)与$(#form input)的区别
  • java命名空间javax.swing.text.html类html.tag的类成员方法: input定义及介绍
  • When use read user's input from standard input device ,i want show it as '*' .How can i do ?
  • java命名空间java.awt.event类keyevent的类成员方法: vk_code_input定义及介绍
  • 我的目的是,能实现点增加按钮,使得逐行(以行为单位)动态的增加窗体<input type=text ><input type=radio><input type=checkbox>三个
  • java命名空间javax.swing类joptionpane的类成员方法: wants_input_property定义及介绍
  • 启用iptables防火墙,要求INPUT方向允许任意主机访问ICMP、TCP的21、22、80、139、445端口,INPUT其他默认禁止访问。
  • java命名空间javax.swing类joptionpane的类成员方法: input_value_property定义及介绍
  • Linux input 驱动
  • java命名空间java.awt类font的类成员方法: dialog_input定义及介绍
  • 解决input对齐问题vertical-alige
  • java命名空间javax.print.attribute.standard类printerstatereason的类成员方法: input_tray_missing定义及介绍
  • jQuery设置input type值示例
  • java命名空间java.awt类awtevent的类成员方法: input_method_event_mask定义及介绍
  • how to input chinese?
  • java命名空间javax.imageio.spi类imagereaderspi的类成员方法: standard_input_type定义及介绍
  • jquery form 隐藏的input 选择
  • java命名空间java.awt.event类inputmethodevent的类成员方法: input_method_first定义及介绍
  • 【帮忙啊!!!】iptables output input
  • java命名空间java.awt.color类icc_profile的类成员方法: class_input定义及介绍
  • jquery检测input checked 控件是否被选中的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3