Servlet处理文件上传,为什么文件大小比原始文件大?

5

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();

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

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


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

8
发送HTTP请求中的文件通常使用multipart/form-data编码。这使得服务器可以在单个请求中区分多个表单数据部分(否则无法在单个请求中发送多个文件和/或输入字段)。每个部分由分界线分隔,并在表单数据标头之前。整个请求正文大致如下(以具有名称为name1name2name3的3个普通文本<input type="text">字段的示例表单为例,其填充了value1value2value3的值):
--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等工具进行解析。

另请参阅:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接