Java Servlet处理文件上传,为什么比原来大?

Java Servlet处理文件上传,为什么比原来大?,java,servlets,file-upload,Java,Servlets,File Upload,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){

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();
请求的getInputStream方法是否获取http头信息


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

在HTTP请求中发送文件通常使用
multipart/form data
编码。这使服务器能够在一个请求中区分多个表单数据部分(否则就不可能在一个请求中发送多个文件和/或输入字段)。每个部分由一个边界分隔,前面是表单数据头。整个请求主体大致如下所示(以一个包含3个普通
字段的表单为例,这些字段的名称分别为
name1
name2
name3
,它们的值分别为
value1
value2
value3
):

——一些边界
内容配置:表单数据;name=“name1”
内容类型:文本/纯文本;字符集=UTF-8
价值1
--一些边界
内容配置:表单数据;name=“name2”
内容类型:文本/纯文本;字符集=UTF-8
价值2
--一些边界
内容配置:表单数据;name=“name3”
内容类型:文本/纯文本;字符集=UTF-8
价值3
--一些边界--
对于名为
file1
的单个
字段,整个请求正文如下所示:

——一些边界
内容配置:表单数据;name=“file1”;filename=“some.ext”
内容类型:应用程序/八位字节流
这里是二进制文件内容
--一些边界--
因此,这基本上就是您通过
request.getInputStream()
读取的内容。您应该从请求正文中解析二进制文件内容。正是这个边界和表单数据头使您上传的文件看起来更大(实际上也已损坏)。如果您使用的是Servlet3.0,那么应该使用
request.getPart()
来获取唯一的文件内容

InputStream content = request.getPart("file1").getInputStream();
// ...
如果您仍然使用Servlet2.5或更早版本,那么您可以使用ApacheCommonsFileUpload等工具来解析它

另见:

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