Quelqu'un peut-il me dire quelle est la meilleure façon de convertir un fichier en plusieurs parties (org.springframework.web.multipart.MultipartFile) en fichier (java.io.File)?
Dans mon projet Web mvc de printemps, je reçois un fichier téléchargé en tant que fichier Multipart.Je dois le convertir en 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é. Thnx
java
spring
spring-mvc
file-upload
cloudinary
Amila Iddamalgoda
la source
la source
MultipartFile.transferTo()
?Réponses:
Vous pouvez obtenir le contenu d'un
MultipartFile
en utilisant lagetBytes
méthode et vous pouvez écrire dans le fichier en utilisantFiles.newOutputStream()
:public void write(MultipartFile file, Path dir) { Path filepath = Paths.get(dir.toString(), file.getOriginalFilename()); try (OutputStream os = Files.newOutputStream(filepath)) { os.write(file.getBytes()); } }
Vous pouvez également utiliser la méthode transferTo :
public void multipartFileToFile( MultipartFile multipart, Path dir ) throws IOException { Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename()); multipart.transferTo(filepath); }
la source
createNewFIle()
est à la fois inutile et inutile ici. Vous êtes maintenant obligénew FileOutputStream()
(via l'OS) à la fois de supprimer le fichier ainsi créé et d'en créer un nouveau.Bien que la réponse acceptée soit correcte, mais si vous essayez simplement de télécharger votre image sur cloudinary, il existe un meilleur moyen:
Où multipartFile est votre org.springframework.web.multipart.MultipartFile .
la source
petite correction sur le post @PetrosTsialiamanis,
new File( multipart.getOriginalFilename())
cela créera un fichier dans l'emplacement du serveur où vous rencontrerez parfois des problèmes d'autorisation d'écriture pour l'utilisateur, il n'est pas toujours possible de donner l'autorisation d'écriture à chaque utilisateur qui effectue une action.System.getProperty("java.io.tmpdir")
créera 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éé, plus tard, vous pouvez supprimer le fichier ou le dossier temporaire.public static File multipartToFile(MultipartFile multipart, String fileName) throws IllegalStateException, IOException { File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+fileName); multipart.transferTo(convFile); return convFile; }
mettez cette méthode dans votre utilité commune et utilisez-la comme par exemple.
Utility.multipartToFile(...)
la source
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.
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
La source de l'enregistrement MultipartFile 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());
la source
FileUtils.touch()
est à la fois inutile et inutile ici. Vous êtes maintenant obligénew FileOutputStream()
(via l'OS) à la fois de supprimer le fichier ainsi créé et d'en créer un nouveau.MultipartFile.transferTo (File) est bien, mais n'oubliez pas de nettoyer le fichier temporaire après tout.
// ask JVM to ask operating system to create temp file File tempFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_POSTFIX); // ask JVM to delete it upon JVM exit if you forgot / can't delete due exception tempFile.deleteOnExit(); // transfer MultipartFile to File multipartFile.transferTo(tempFile); // do business logic here result = businessLogic(tempFile); // tidy up tempFile.delete();
Consultez le commentaire de Razzlero sur File.deleteOnExit () exécuté à la sortie de la JVM (ce qui peut être extrêmement rare) ci-dessous.
la source
deleteOnExit()
, il ne se déclenchera qu'à la fin de la JVM, il ne se déclenchera donc pas pendant les exceptions. Pour cette raison, vous devez être prudentdeleteOnExit()
lorsque vous utilisez des applications de longue durée telles que des applications serveur. Pour les applications serveur, la JVM se fermera rarement. Vous devez donc faire attention à ne pasdeleteOnExit()
provoquer de fuites de mémoire. La JVM a besoin de garder une trace de tous les fichiers qu'elle doit supprimer à la sortie qui ne sont pas effacés car la JVM ne s'arrête pas.private File convertMultiPartToFile(MultipartFile file ) throws IOException { File convFile = new File( file.getOriginalFilename() ); FileOutputStream fos = new FileOutputStream( convFile ); fos.write( file.getBytes() ); fos.close(); return convFile; }
la source
Vous pouvez accéder au fichier temporaire dans Spring en effectuant un cast si la classe de l'interface
MultipartFile
estCommonsMultipartFile
.public File getTempFile(MultipartFile multipartFile) { CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile; FileItem fileItem = commonsMultipartFile.getFileItem(); DiskFileItem diskFileItem = (DiskFileItem) fileItem; String absPath = diskFileItem.getStoreLocation().getAbsolutePath(); File file = new File(absPath); //trick 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
maxInMemorySize
propriété peut être définie sur 0 dans la@Configuration
@EnableWebMvc
classe. 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; }
la source
createNewFIle()
est à la fois inutile et inutile ici. Vous êtes maintenant obligénew FileOutputStream()
(via l'OS) à la fois de supprimer le fichier ainsi créé et d'en créer un nouveau.La réponse d'Alex78191 a fonctionné pour moi.
public File getTempFile(MultipartFile multipartFile) { CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile; FileItem fileItem = commonsMultipartFile.getFileItem(); DiskFileItem diskFileItem = (DiskFileItem) fileItem; String absPath = diskFileItem.getStoreLocation().getAbsolutePath(); File file = new File(absPath); //trick 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 d'une taille supérieure à 10240 octets, veuillez modifier maxInMemorySize dans multipartResolver à 1 Mo.
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- setting maximum upload size t 20MB --> <property name="maxUploadSize" value="20971520" /> <!-- max size of file in memory (in bytes) --> <property name="maxInMemorySize" value="1048576" /> <!-- 1MB --> </bean>
la source
maxInMemorySize
n'a rien à voir avec la limitation de la taille de téléchargement des fichiers. La taille de téléchargement du fichier est définie par lamaxUploadSize
propriété.maxInMemorySize
prop peut être défini sur0
.si vous ne souhaitez pas utiliser MultipartFile.transferTo (). Vous pouvez écrire un fichier comme celui-ci
val dir = File(filePackagePath) if (!dir.exists()) dir.mkdirs() val file = File("$filePackagePath${multipartFile.originalFilename}").apply { createNewFile() } FileOutputStream(file).use { it.write(multipartFile.bytes) }
la source