📄 1046047.xml
字号:
<ranknum>user4</ranknum>
<credit>100</credit>
<ReplyID>6756444</ReplyID>
<TopicID>1046047</TopicID>
<PostUserId>246001</PostUserId>
<PostUserName>Tmsheng</PostUserName>
<Point>0</Point>
<Content>package mshtang.fileUpload;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
/**存放报文内容的类,提供类似于 ServletRequest 中的部分 get 方法
*你必须在 html 页面的窗体(form)中指定 enctype="multipart/form-data"。
*才可以正确的使用这个类。
**/
public class ContentFactory
{
    private Hashtable values;        //存放name=value,其中value存放在另一个类中
    private Hashtable files;         //存放文件内容的。
    private ContentFactory(Hashtable values, Hashtable files)
    {
        this.values=values;
        this.files=files;
    }
    public String getParameter(String name)
    {
        Vector v = (Vector)values.get(name);
        if( v != null)
        {
          return (String)v.elementAt(0);
        }
        return null;
    }
    public Enumeration getParameterNames()
    {
        return values.keys();
    }
    public String[] getParameterValues(String name)
    {
        Vector v = (Vector)values.get(name);
        if(v != null)
        {
          String[] result = new String[v.size()];
          v.toArray(result);
          return result;
        }
        return new String[0];
    }
   /**
     *返回一个 FileHolder 实例,该实例包含了通过字段名为name的file控件上载的文件信息,
     *如果不存在这个字段或者提交页面时,没有选择上载的文件,则返回 null。
     * <p>如果 Html 页面中存在不止一个字段名为name的file控件,
     * 返回值等于{@link #getFileParameterValues}中的第一个元素。
     *
     * @param name:一个<code>String</code>,对应于Html页面窗体中file控件
     *的name 属性。
     *
     * @return返回:一个 FileHolder 实例,该实例包含了通过字段名为 name 的 file 控件上载的文件信息,
     *如果不存在这个字段或者提交页面是,没有选择上载的文件,则返回 null。
     *
     * @see 		#getFileParameterValues
     *
     */
    public FileHolder getFileParameter(String name)
    {
        Vector v = (Vector)files.get(name);
        if(v != null)
        {
          return (FileHolder)v.elementAt(0);
        }
        return null;
    }
    /**
     * 返回一个 由 String 对象构成的 Enumeration ,包含了 Html 页面
     *窗体中所有 file 控件的 name 属性。
     *如果窗体中没有 file 控件,则返回一个空的 Enumeration
     * @return		     返回一个 由 String 对象构成的 Enumeration ,包含了 Html 页面
     *窗体中所有 file 控件的 name 属性。
     *如果窗体中没有 file 控件,则返回一个空的 Enumeration
     */
    public Enumeration getFileParameterNames()
    {
        return files.keys();
    }
   /**
     *返回一个 FileHolder 数组,该数组包含了所有通过字段名为 name 的 file 控件上载的文件信息,
     *如果不存在这个字段或者提交页面时,没有选择任何上载的文件,则返回一个 零元素的数组(不是 null )。
     * @param name 	一个 <code>String</code> ,对应于 Html 页面窗体中 file 控件
     *的name 属性。
     *
     * @return		返回一个 FileHolder 数组,该数组包含了所有通过字段名为 name 的 file 控件上载的文件信息,
     *如果不存在这个字段或者提交页面时,没有选择任何上载的文件,则返回一个 零元素的数组(不是 null )。
     *
     * @see 		#getFileParameter
     */
    public FileHolder[] getFileParameterValues(String name)
    {
        Vector v=(Vector)files.get(name);
        if(v!=null)
        {
            FileHolder[] result=new FileHolder[v.size()];
            v.toArray(result);
            return result;
        }
        return new FileHolder[0];
    }
    //------------->Factory 部分
    /**
    **返回根据当前请求生成的一个 ContentFactory 实例
    **@param request 提交的请求
    **@return 返回根据当前请求生成的一个 ContentFactory 实例,如果 request
    数据包的内容不是以 mutilpart/form-data 型编码,则返回 null。
    **@throws ContentFactoryException 当提交的数据和文件太大时抛出,
    **根据 Content-Length 判断,默认的许可值为 1024* 1024。
    **/
    public static ContentFactory getContentFactory(HttpServletRequest request) throws ContentFactoryException,IOException
    {
        // default maxLength is 1MB.
        return getContentFactory(request, 1024*1024);
    }
        /**
    **返回根据当前请求生成的一个 ContentFactory 实例
    **@param request 提交的请求
    **@param maxLength 数据包的最大长度,默认为1024*1024
    **@return 返回根据当前请求生成的一个 ContentFactory 实例,如果 request
    数据包的内容不是以 mutilpart/form-data 型编码,则返回 null。
    **@throws ContentFactoryException 当提交的数据和文件太大时抛出,
    **根据 Content-Length 判断,默认的许可值为 1024* 1024。
    **/
    public static ContentFactory getContentFactory(HttpServletRequest request, int maxLength) throws ContentFactoryException, IOException
    {
      Hashtable values = new Hashtable();
      Hashtable files = new Hashtable();
      String contentType = request.getContentType();
      int contentLength = request.getContentLength();
      if (contentLength > maxLength)
      {
        ContentFactoryException e=new ContentFactoryException("上传数据太多,请不要选择太大的文件");
        throw e;
      }
      if(contentType == null || !contentType.startsWith("multipart/form-data"))
      {
        return null;
      }
//get out the boudary from content-type
      int start = contentType.indexOf("boundary=");
//这里应该
      int boundaryLen = new String("boundary=").length();
      String boundary = contentType.substring(start + boundaryLen);
      boundary = "--" + boundary;
//用字节表示,以免 String  和 byte 数组的长度不一致
      boundaryLen = bytesLen(boundary);
//把request 中的数据读入一个byte数组
      byte buffer[] = new byte[contentLength];
      int once = 0;
      int total = 0;
      DataInputStream in = new DataInputStream(request.getInputStream());
      while((total < contentLength) && (once >= 0))
      {
        once = in.read(buffer, total, contentLength);
        total += once;
      }
//对buffer中的数据进行拆分
      int pos1 = 0;                  //pos1 记录 在buffer 中下一个 boundary 的位置
//pos0,pos1 用于 subBytes 的两个参数
      int pos0 = byteIndexOf(buffer, boundary, 0);//pos0 记录 boundary 的第一个字节在buffer 中的位置
      do
      {
        pos0 += boundaryLen;                                 //记录boundary后面第一个字节的下标
        pos1 = byteIndexOf(buffer, boundary, pos0);
        if(pos1==-1)
        {
          break;
        }//
        pos0 += 2;//考虑到boundary后面的 \r\n
        parse(subBytes(buffer, pos0, pos1-2), values, files);      //考虑到boundary后面的\r\n
        pos0=pos1;
      }while(true);
      return new ContentFactory(values,files);
    }</Content>
<PostDateTime>2002-9-23 19:39:34</PostDateTime>
</Reply>
<Reply>
<PostUserNickName>小唐蔡</PostUserNickName>
<rank>四级(中级)</rank>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -