web-dev-qa-db-fra.com

Comment convertir un fichier multipart 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 mvc de printemps, le fichier téléchargé est un fichier multipart. Je dois le convertir en fichier (io). Par conséquent, je peux appeler ce service de stockage d'images ( Cloudinary ). Fichier).

J'ai fait tant de recherches, mais j'ai échoué. Si quelqu'un connaît un moyen standard, merci de me le faire savoir? Thnx

66
Amila Iddamalgoda

Vous pouvez obtenir le contenu de multipartFile en utilisant la méthode getBytes et vous pouvez créer une instance de la classe File en utilisant 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;
}
162

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:

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

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

9
Heisenberg

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());
2

Vous pouvez accéder à tempfichier dans Spring en convertissant 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;
    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 vous débarrasser de cette 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;
    }
0
Alex78191

La réponse de 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 le téléchargement de fichiers dont la taille est supérieure à 10 240 octets, veuillez définir maxInMemorySize dans multipartResolver sur 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>
0
Anand Tagore

si vous ne voulez 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)
    }
0
Artem Botnev
  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;
    }
0

MultipartFile.transferTo (File) est agréable, 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 if you forgot / can't due exception
tempFile.deleteOnExit();

// transfer MultipartFile to File
multipartFile.transferTo(tempFile);

// do business logic here
result = businessLogic(tempFile);

// tidy up
tempFile.delete();
0
andrej