Comment convertir un fichier multiparti en fichier?

Quelqu’un peut-il me dire quel est le meilleur moyen de convertir un fichier multipart (org.springframework.web.multipart.MultipartFile) en fichier (java.io.File)?

Dans mon projet web spring mvc je reçois un fichier téléchargé en tant que fichier Multipart.Je dois le convertir en un fichier (io), je peux donc appeler ce service de stockage d’images ( Cloudinary ) .Ils ne prennent que le type (File).

J’ai fait tellement de recherches mais j’ai échoué. Si quelqu’un connaît un bon moyen standard, faites-le moi savoir? Thnx

Vous pouvez obtenir le contenu de multipartFile à l’aide de la méthode getBytes et créer une instance de la classe File à l’aide de la classe FileOutputStream .

 public File convert(MultipartFile file) { File convFile = new File(file.getOriginalFilename()); convFile.createNewFile(); FileOutputStream fos = new FileOutputStream(convFile); fos.write(file.getBytes()); fos.close(); return convFile; } 

Vous pouvez également utiliser la méthode transferTo :

 public File multipartToFile(MultipartFile multipart) throws IllegalStateException, IOException { File convFile = new File( multipart.getOriginalFilename()); multipart.transferTo(convFile); return convFile; } 

Bien que la réponse acceptée soit correcte, mais si vous essayez simplement de télécharger votre image vers le cloud, il existe une meilleure méthode:

 Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap()); 

Où multipartFile est votre org.springframework.web.multipart.MultipartFile .

Vous pouvez également utiliser la bibliothèque Apache Commons IO et la classe FileUtils . Si vous utilisez maven, vous pouvez le charger en utilisant la dépendance ci-dessus.

  commons-io commons-io 2.4  

La source de l’enregistrement multipartite sur le disque.

 File file = new File(directory, filename); // Create the file using the touch method of the FileUtils class. // FileUtils.touch(file); // Write bytes from the multipart file to disk. FileUtils.writeByteArrayToFile(file, multipartFile.getBytes()); 

petite correction sur le post @PetrosTsialiamanis, new File( multipart.getOriginalFilename()) cela créera un fichier sur le serveur où vous rencontrerez parfois des problèmes d’écriture pour l’utilisateur, il n’est pas toujours possible d’accorder des droits d’écriture à tous les utilisateurs. System.getProperty("java.io.tmpdir") va créer un répertoire temporaire dans lequel votre fichier sera créé correctement. De cette façon, vous créez un dossier temporaire, où le fichier est créé, puis vous pouvez supprimer le fichier ou le dossier temporaire.

 public static File multipartToFile(MultipartFile multipart, Ssortingng fileName) throws IllegalStateException, IOException { File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+fileName); multipart.transferTo(convFile); return convFile; } 

mettre cette méthode dans votre utilitaire commun et l’utiliser comme par exemple. Utility.multipartToFile(...)

La réponse par Alex78191 a fonctionné pour moi.

 public File getTempFile(MultipartFile multipartFile) { CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile; FileItem fileItem = commonsMultipartFile.getFileItem(); DiskFileItem diskFileItem = (DiskFileItem) fileItem; Ssortingng absPath = diskFileItem.getStoreLocation().getAbsolutePath(); File file = new File(absPath); //sortingck to implicitly save on disk small files (<10240 bytes by default) if (!file.exists()) { file.createNewFile(); multipartFile.transferTo(file); } return file; } 

Pour télécharger des fichiers dont la taille est supérieure à 10240 octets, définissez le paramètre maxInMemorySize dans multipartResolver sur 1 Mo.

        

Vous pouvez accéder à tempfile dans Spring par conversion si la classe de l’interface MultipartFile est CommonsMultipartFile .

 public File getTempFile(MultipartFile multipartFile) { CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile; FileItem fileItem = commonsMultipartFile.getFileItem(); DiskFileItem diskFileItem = (DiskFileItem) fileItem; Ssortingng absPath = diskFileItem.getStoreLocation().getAbsolutePath(); File file = new File(absPath); //sortingck to implicitly save on disk small files (<10240 bytes by default) if (!file.exists()) { file.createNewFile(); multipartFile.transferTo(file); } return file; } 

Pour se débarrasser de l'astuce avec des fichiers de moins de 10240 octets, la propriété maxInMemorySize peut être définie sur 0 dans la classe @Configuration @EnableWebMvc . Après cela, tous les fichiers téléchargés seront stockés sur le disque.

 @Bean(name = "multipartResolver") public CommonsMultipartResolver createMultipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("utf-8"); resolver.setMaxInMemorySize(0); return resolver; }