2017-05-31 1 views
0

Le fichier d'un formulaire envoie-t-il des parties différentes dans une demande multipart/form-data?Une requête http mutlipart peut-elle diviser le fichier en plusieurs parties?

Je dois envoyer un fichier à partir de mon formulaire à un point d'extrémité 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); 


     } 
    } 

} 

C'est la classe qui traite les données de formulaire en plusieurs parties.

Mais je ne comprenais pas pourquoi la méthode API RestEasy getFormDataMap retourne une liste de InputPart:

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

peut-il file être découpé en différentes parties?

Dois-je considérer que la première partie:

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

Répondre

2

Lorsque vous publiez un formulaire, vous envoyez une liste de paires clé-valeur, mais chaque clé peut apparaître plusieurs fois avec des valeurs différentes. En programmation, ce type de structure est appelé ListMultimap (ou potentiellement SetMultiMap).

Les formulaires sont généralement codés en utilisant application/x-www-form-urlencoded, ce qui signifie que seules les valeurs de chaîne sont autorisées. Si vous devez télécharger des fichiers, vous devez utiliser multipart/form-data, mais la même clé peut toujours contenir plusieurs valeurs.

fichier en plusieurs parties ne signifie pas qu'un fichier est divisée en plusieurs parties, cela signifie que la demande est divisé en plusieurs parties. Chaque partie est constituée d'une valeur basée sur une chaîne normale ou d'un fichier (et de métadonnées) et chaque paramètre est séparé par une limite. Si vous créez un formulaire multipart/form-data et avez 5 champs de téléchargement de fichier tous nommés "fichier", et que vous avez téléchargé un fichier différent dans chacun d'eux, alors List<InputPart> inputParts = uploadForm.get("file"); retournera une liste de taille 5, une pour chaque valeur différente pour la clé nommée "fichier".

Dans la plupart des cas, l'interface utilisateur n'a qu'un seul champ de téléchargement, et dans ce cas j'utiliserais simplement uploadForm.get("file").get(0), et éventuellement vérifier la taille de la liste et lancer une exception si la taille était supérieure à 1 (ou exactement 1 si le fichier est requis).