2

J'écris une API en utilisant Spring + apache commons.Vérification de la taille réelle du fichier lors de la diffusion de fichiers avec FileItemStream

https://commons.apache.org/proper/commons-fileupload/

Il y a un problème que je faisais face. Je dois valider une taille de fichier. Si c'est plus gros que celui que je configure, l'utilisateur devrait avoir une erreur. Pour l'instant, je mis en œuvre le téléchargement sans cette vérification et il ressemble à ceci:

public ResponseEntity insertFile(@PathVariable Long profileId, HttpServletRequest request) throws Exception { 
    ServletFileUpload upload = new ServletFileUpload(); 
    FileItemIterator uploadItemIterator = upload.getItemIterator(request); 
    if (!uploadItemIterator.hasNext()) { 
     throw new FileUploadException("FileItemIterator was empty"); 
    } 
    while (uploadItemIterator.hasNext()) { 
     FileItemStream fileItemStream = uploadItemIterator.next(); 
     if (fileItemStream.isFormField()) { 
      continue; 
     } 
     //do stuff 
    } 
    return new ResponseEntity(HttpStatus.OK); 
} 

Il fait exactement ce que je dois. Cela ne me demande pas de charger complètement le fichier dans la mémoire. J'utilise InputStream que je dois effectuer un transfert ultérieur vers un autre service. Finalement, je n'ai pas de fichier chargé dans la mémoire complètement à tout moment. Cependant, cela m'empêche d'obtenir le nombre total de piqûres qui ont été chargées.

Existe-t-il un moyen de gérer une telle validation sans télécharger le fichier complètement ou l'enregistrer quelque part?

J'ai essayé FileItem, mais cela nécessite un chargement complet du fichier.

Répondre

1

ServletFileUpload a une méthode setSizeMax qui contrôle la taille de fichier maximale acceptée pour chaque requête. Pour réduire les problèmes de consommation de mémoire, vous pouvez utiliser DiskFileFactory pour définir le stockage du fichier disque pour les fichiers plus volumineux. Vous devez toujours obtenir les fichiers parce que la confiance dans les en-têtes n'est pas fiable mais je pense que cela fera l'affaire :)

+0

Celui-ci fait le travail. Merci! Je comprends toute l'importance de ne pas faire confiance aux en-têtes. Cependant, dans mon cas, je n'ai pas d'options. Le service auquel je transfère doit échouer, mon travail consiste simplement à donner à l'utilisateur une exception conviviale et à ne pas effectuer tout le travail supplémentaire pendant le transfert du fichier. – dvelopp

+0

Il semble que l'exception ne se produise que lorsqu'une partie du fichier est traitée. Donc, si la taille maximale est de 5 Go, je dois d'abord traiter 5 Go pour comprendre si le fichier correspond à mes exigences ou non. Je sautillais qu'il devrait y avoir un moyen de le dire sur la scène de validation (avant de télécharger) – dvelopp

+0

Vous pouvez le vérifier sur le client du service avant de l'envoyer. Est-ce vous qui développez aussi? HTML + JavaScript n'est-ce pas? Est-ce sous forme de téléchargement? – Joao