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

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头信息?

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

通常使用multipart/form-data编码来发送HTTP请求中的文件。 这使得服务器能够在单个请求中区分多个表单数据部分(否则将无法在单个请求中发送多个文件和/或输入字段)。 每个部分由边界分隔,并在表单数据头之前。 整个请求主体大致如下所示(以3个普通的字段为例,其名称为name1name2name3 ,其值为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的单个字段,整个请求主体如下所示:

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

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

也可以看看:

  • 如何使用JSP / Servlet将文件上传到服务器?