一个 http 多部分请求可以将文件分成多个部分吗?

Can one http mutlipart request split up the file in multiple parts?

表单中的文件是否作为 multipart/form-data 请求中的不同部分发送?

我必须将一个文件从我的表单发送到一个 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);


        }
    }

}

这是处理多部分表单数据的class。

但是我不明白为什么RestEasyAPI方法getFormDataMapreturns一个InputPart的列表:

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

这个file可以拆分成不同的部分吗?

我应该只考虑第一部分吗:

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

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

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

Multipart file 并不是说​​一个file被分割成多个部分,而是说request被分割成多个部分。每个部分都包含一个基于普通字符串的值或一个文件(和元数据),并且每个参数由边界分隔。

如果您创建了一个 multipart/form-data 表单,并且有 5 个文件上传字段都命名为 "file",并且您在每个字段中上传了不同的文件,那么 List<InputPart> inputParts = uploadForm.get("file"); 将 return 一个大小为 5 的列表,每个列表对应名为 "file" 的键的每个不同值。

在大多数情况下,UI 将只有一个上传字段,在这种情况下,我将只使用 uploadForm.get("file").get(0),并可能检查列表的大小,如果大小大于 1(如果需要文件,则刚好为 1)。