【问题标题】:Servlet handling file-upload, Why bigger than the original?Servlet处理文件上传,为什么比原来大?
【发布时间】:2012-11-02 14:12:40
【问题描述】:

Servlet doPost 处理文件上传,

    InputStream in = req.getInputStream();

    File file = new File("c:/8.dat");
    OutputStream out = new FileOutputStream(file);
    byte[] buffer = new byte[1024];

    int len =0;
    while((len=in.read(buffer))!=-1){
        out.write(buffer, 0, len);
    }
    bao.close();
    out.close();
    in.close();

Dose Request 的getInputStream 方法获取http 头信息?

为什么上传的文件比原来的大?

【问题讨论】:

  • getInputStream 返回一个流,您可以从中读取请求正文(或在您的情况下上传的文件),HTTP 标头不包含在流中,它们由框架处理,您可以获得Request 对象中的那些标头。
  • 不,我检查了上传的文件,文件头有http头信息..
  • 我不知道file-header 是什么,唯一可以确定的是req.getInputStream() 返回的流中不包含HTTP 标头。 我假设 'req' 是 ServletRequest 的一个实例或 JSP 中的请求对象

标签: java servlets file-upload


【解决方案1】:

在 HTTP 请求中发送文件通常使用multipart/form-data 编码完成。这使服务器能够在单个请求中区分多个表单数据部分(否则将无法在单个请求中发送多个文件和/或输入字段)。每个部分由一个边界分隔,并且前面是表单数据标题。整个请求正文大致如下所示(以具有名称 name1name2name3 的 3 个普通字段的示例表单为例:

--SOME_BOUNDARY
content-disposition: form-data;name="name1"
content-type: text/plain;charset=UTF-8

value1
--SOME_BOUNDARY
content-disposition: form-data;name="name2"
content-type: text/plain;charset=UTF-8

value2
--SOME_BOUNDARY
content-disposition: form-data;name="name3"
content-type: text/plain;charset=UTF-8

value3
--SOME_BOUNDARY--

使用名称为 file1 的单个 <input type="file"> 字段,整个请求正文如下所示:

--SOME_BOUNDARY
content-disposition: form-data;name="file1";filename="some.ext"
content-type: application/octet-stream

binary file content here
--SOME_BOUNDARY--

这就是request.getInputStream() 阅读的内容。您应该从请求正文中解析二进制文件内容。正是这个边界和表单数据标题使您上传的文件看起来更大(实际上也损坏了)。如果您使用的是 servlet 3.0,则应该使用 request.getPart() 来获取唯一的文件内容。

InputStream content = request.getPart("file1").getInputStream();
// ...

如果您仍在使用 servlet 2.5 或更早版本,那么您可以使用 Apache Commons FileUpload 来解析它。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2018-04-29
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多