2017-05-31 41 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如果文件是必需的)。

相關問題