web-dev-qa-db-de.com

Wie konvertiert man eine mehrteilige Datei in eine Datei?

Kann mir jemand sagen, wie man eine mehrteilige Datei (org.springframework.web.multipart.MultipartFile) am besten in eine Datei (Java.io.File) konvertiert?

In meinem Frühjahr-MVC-Webprojekt bekomme ich eine hochgeladene Datei als Multipart-Datei. Ich muss sie in eine Datei (io) konvertieren, daher kann ich diesen Bildspeicherdienst (Cloudinary) nennen Typ (Datei).

Ich habe schon so viele Suchen durchgeführt, bin aber gescheitert. Wenn jemand einen guten Standardweg kennt, lass es mich wissen? Thnx

66

Sie können den Inhalt von multipartFile mithilfe der getBytes-Methode abrufen und mithilfe der File-Klasse eine Instanz der FileOutputStream-Klasse erstellen.

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;
}

Sie können auch die Methode transferTo verwenden :

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

Die akzeptierte Antwort ist zwar korrekt, aber wenn Sie nur versuchen, Ihr Image in Cloudinary hochzuladen, gibt es einen besseren Weg:

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

Wo MultipartFile ist Ihr org.springframework.web.multipart.MultipartFile .

9
Heisenberg

kleine Korrektur am @PetrosTsialiamanis-Post, new File( multipart.getOriginalFilename()) Hierdurch wird eine Datei am Serverstandort erstellt, an dem es gelegentlich zu Problemen mit der Schreibberechtigung für den Benutzer kommt. Es ist nicht immer möglich, jedem Benutzer eine Schreibberechtigung zu erteilen Benutzer, der die Aktion ausführt. System.getProperty("Java.io.tmpdir") erstellt ein temporäres Verzeichnis, in dem Ihre Datei ordnungsgemäß erstellt wird. Auf diese Weise erstellen Sie einen temporären Ordner, in dem die Datei erstellt wird. Später können Sie eine Datei oder einen temporären Ordner löschen.

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;
}

stellen Sie diese Methode in Ihr allgemeines Dienstprogramm und verwenden Sie sie wie z. Utility.multipartToFile(...)

9
Swadeshi

Sie können auch die Bibliothek Apache Commons IO und die Klasse FileUtils verwenden. Falls Sie Maven verwenden, können Sie es mit der obigen Abhängigkeit laden.

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

Die Quelle für die MultipartFile wird auf der Festplatte gespeichert.

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

Sie können auf tempfile in Spring zugreifen, indem Sie das Casting verwenden, wenn die Klasse der Schnittstelle MultipartFileCommonsMultipartFile ist.

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;
}

Um den Trick mit Dateien mit weniger als 10240 Bytes zu beseitigen, kann die maxInMemorySize-Eigenschaft in der Klasse @Configuration@EnableWebMvc auf 0 gesetzt werden. Danach werden alle hochgeladenen Dateien auf der Festplatte gespeichert.

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

Die Antwort von Alex78191 hat bei mir funktioniert.

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;
}

Um Dateien mit einer Größe von mehr als 10240 Bytes hochzuladen, ändern Sie den Wert für maxInMemorySize in multipartResolver auf 1 MB.

<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

wenn Sie MultipartFile.transferTo () nicht verwenden möchten. Sie können so eine Datei schreiben

    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) ist Nizza, aber vergessen Sie nicht, die temporäre Datei zu bereinigen.

// 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