在 HTTP 请求中发送文件通常使用multipart/form-data
编码完成。这使服务器能够在单个请求中区分多个表单数据部分(否则将无法在单个请求中发送多个文件和/或输入字段)。每个部分由一个边界分隔,并且前面是表单数据标题。整个请求正文大致如下所示(以一个示例表单为例,其中包含 3 个普通<input type="text">
字段,名称为name1
,name2
并且name3
具有值value1
,value2
并已value3
填充):
--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--
使用名称为单个<input type="file">
字段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();
// ...
如果您仍在使用 servlet 2.5 或更早版本,那么您可以使用 Apache Commons FileUpload 来解析它。
也可以看看: