首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

HTTP Post 资料的一些细节【转载】

2012-07-03 
HTTP Post 文件的一些细节【转载】package com.upload    import java.io.*  import javax.servlet.*  im

HTTP Post 文件的一些细节【转载】

package com.upload;    import java.io.*;  import javax.servlet.*;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.ServletInputStream;     public class UpBean {     public void doUpload(HttpServletRequest req) throws ServletException, IOExcept  ion{  //首先定义一个文本文件  File file = new File("out.txt");  //readCount 记录从输入流中实际读取的字符数  int readCount;  //输入流缓冲区  byte[] readByte = new byte[1024];  //初始化输入流  ServletInputStream servletInputStream = req.getInputStream();  //初始化一个输出流(到文件)  FileOutputStream fileOutputStream = new FileOutputStream(file);  //循环从读取输入流中读取字节  readCount = servletInputStream.readLine(readByte, 0,readByte.length);    while(readCount != -1){  fileOutputStream.write(readByte,0,readCount);  readCount = servletInputStream.readLine(readByte, 0, 1024);  }  //关闭文件流  fileOutputStream.flush();  }  }

  
  为了便于我们阅读流,上载的两个文件为两个简单的文本文件(有格式的文件,不便于直接分析):one.txt及two.txt,文件内容如下,实验时请建立对应文本文件,内容请直接copy以下所示:
  
  one.txt:
  
  one
  one one
  one one one
  
     two.txt
  two
  two two
  two two two
  
  都准备好以后,我们就可以运行了,运行时请注意,文本部分及文件部分最好不要出现汉字,或其他双字符集字符,尽量采用英文,因为接收是采用的Unicode字符集,我们未对输入做任何处理。 我们在三个输入框输入的字符为,说明一:explain1;说明二:explain2;说明三:explain3,out.txt接收到如下字符:
  
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="explain1"
  
  explain1
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="explain2"
  
  explain2
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="file1"; filename="C:/test/one.txt"
  Content-Type: text/plain
  
  one
  
  one one
  one one one
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="file2"; filename="C:/test/two.txt"
  Content-Type: text/plain
  
  two
  two two
  two two two
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="explain3"
  
  explain3
  -----------------------------7d2623a3e0286--
   可以很明显的看到,out.txt被“-----------------------------7d2623a3e0286”分成了五 节,即表单的每个输入部分都对应一节,结尾部分是“-----------------------------7d2623a3e0286--”,刚好 比开始的一段字符在最后多出两个“-”, 每节的第一行是输入内容的说明“Content-Disposition: form-data”,“name="explain1"”表示 上载请求项的name,文本输入部分仅这两个说明,如果输入的是文件还用两项说明:“filename="C:/test/one.txt"”,表示输入 源,基于ms-windows的ie上载带有完整的路径,netscape及其他浏览器可能只有一个文件名;还有一项是关于输入格式的“Content- Type:text/plain”;表示输入格式是文本类型,如果我们上载的是bmp文件则为“Content-Type: image/bmp”,word文件为“application/msword”...,说明的下面紧接着是一个空行,然后下面才是我们所需的内容。
  
  仔细分析未加修改的输入流格式,有助于我们实现文件与输入文本的准确分离。
   通过以上的分析可以看出,准确分离上载的文件及文本信息需要以下要素:1、数据段分割符、结束符(比分割符多出两个“-”);2、输入文本及上载的文件 区分标志(文本为“name=”,文件为“filename=”);3、编码格式,可以通过HttpServletRequest 类getCharacterEncoding() 方法取得。4、表单文本部分名称及内容,名称为“name=”后面的字符,内容为该段第三行及以后的内容;5、文件名称及内容,名称为 “filename=”后面的字符,内容为该段第三行及以后的内容。
  
  下面我们将讨论输入流的分离。
  
  程序实现分析
   我们首先画出程序实现的主体结构图,请注意判断文件标志(indexOf("filename=")>0),与判断文本标志 (indexOf("name=")>0)的顺序,当(indexOf("filename=")>0)成立时, (indexOf("name=")>0)一定也是成立的,所以判断文件要在判断文本前。
  
  分离文件及输入文本,为完整
保存上 载的文件信息及输入的文本信息,本程序建立了两个类:public class FileInfo 、public class InputField,及两个线性表private ArrayList upFilesList、private ArrayList inputFieldList,用于动态增加文件信息及文本信息,定义如下:
  
  FileInfo.java(记录上载文件信息)
  
  package com.upload;
  
  public class FileInfo {
  private String fileName;
  private boolean validFlag;
  private String filePath;
  private long fileSize;
  
  //设置文件信息
  //上载文件是否有效标志
  public void setValidFlag(boolean validFlag){
  
  this.validFlag = validFlag;
  }
  //文件名
  public void setFileName(String filename){
  this.fileName = filename;
  }
  //存贮路


【转载地址】http://blog.csdn.net/collin1211/article/details/3074468

参照学习文章:http://robert-liu.iteye.com/blog/713568

热点排行