2017-05-31 40 views
0

表单中的文件是否作为multipart/form-data请求中的不同部分发送?一个http mutlipart请求可以将文件分成多个部分吗?

我必须将文件从我的表单发送到一个REST端点。

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.jboss.resteasy.plugins.providers.multipart.InputPart; 
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; 

public class BulkUploadTask { 


    public void readFile(MultipartFormDataInput input) throws IOException, InvalidFormatException{ 

     Map<String, List<InputPart>> uploadForm = input.getFormDataMap(); 
     List<InputPart> inputParts = uploadForm.get("file"); 

     for (InputPart part : inputParts) { 

      InputStream inputStream = part.getBody(InputStream.class, null); 


     } 
    } 

} 

这是处理Multipart表单数据的类。

但我不明白为什么getFormDataMap返回InputPart列表中RestEasy的API方法:

List<InputPart> inputParts = uploadForm.get("file"); 

可以这样file劈裂为不同的部分?

我应该只考虑第一部分:

uploadForm.get("file").get(0)

回答

2

当您发布表单时,会发送一个键值对列表,但每个键可以多次显示不同的值。在编程中,这种类型的结构被称为ListMultimap(或潜在的SetMultiMap)。

表格通常使用application/x-www-form-urlencoded进行编码,这意味着只允许字符串值。如果您需要上传文件,则需要使用multipart/form-data,但同一个密钥仍可以保存多个值。

多部分文件并不意味着一个文件被分成多个部分,这意味着请求被分成多个部分。每个部分由基于字符串的常规值或文件(和元数据)组成,每个参数由边界分隔。

如果创建一个multipart/form-data形式,并有5个文件上传域都命名为“文件”,你在每一个上传不同的文件,然后List<InputPart> inputParts = uploadForm.get("file");将返回5号,一个列表为每个不同的值名为“文件”的密钥。

在大多数情况下,UI将只有一个上传字段,在这种情况下,我只会使用uploadForm.get("file").get(0),并且可能检查列表的大小,并在大小大于1时抛出异常(或者刚好是1如果文件是必需的)。

相关问题