2014-06-21 8 views
45

Kann mir jemand sagen, was der beste Weg ist, eine mehrteilige Datei (org.springframework.web.multipart.MultipartFile) in Datei (java.io.File) zu konvertieren?Wie konvertiert man eine mehrteilige Datei in Datei?

In meinem Spring MVC Web-Projekt, das ich bin immer hochgeladene Datei als Multipart file.I es in eine Datei konvertieren (io), deshalb soll ich diesen Bildspeicherdienst anrufen (Cloudinary) .Sie nur nehmen Geben Sie (Datei) ein.

Ich habe so viele Suchen gemacht, aber gescheitert.Wenn jemand einen guten Standard Weg weiß bitte lass es mich wissen? Thnx

+3

Gibt es etwas, das Sie davon abhält, die Methode 'MultipartFile.transferTo()' zu verwenden? – fajarkoe

Antwort

119

Sie können den Inhalt von multipartFile erhalten, indem die getBytes Methode verwenden und Sie können mithilfe der FileOutputStream Klasse eine Instanz der Klasse File 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 transferTo method verwenden:

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

Ich habe transferTo Funktion verwendet, aber ich glaube, da ist ein Problem. like Es hält die temporäre Datei für den lokalen Rechner an. – Ronnie

+0

@Ronnie Ich habe das gleiche Problem. Haben Sie eine Problemumgehung gefunden? –

+0

org.apache.commons.io.FileUtils.deleteQuietly (convFile.getParentFile()); , sollte dies die temporäre Datei löschen @Ronnie – kavinder

2

Sie können auch die Apache Commons IO Bibliothek und die FileUtils class verwenden. Wenn 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 auf Platte speichern.

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()); 
+0

'FileUtils.touch()' ist hier sinnlos und verschwenderisch. Sie verpflichten nun 'new FileOutputStream()' (über das OS) sowohl die so erstellte Datei zu löschen als auch * eine neue zu erstellen. – EJP

+0

Vielen Dank für Ihren Kommentar. Ich habe die Quelle der Methode FileUtils.writeByteArrayToFile überprüft. Ich denke, dass diese Methode die Datei nicht neu erstellt, falls sie existiert (Version 2.4). Das multipartFile-Objekt enthält die Bytes der hochgeladenen Datei, die wir irgendwo im Dateisystem speichern möchten. Mein Zweck ist es, diese Bytes an einem bevorzugten Ort zu speichern. Der einzige Grund, warum ich die FileUtils.touch Methode behalte, ist klarzustellen, dass dies eine neue Datei ist. FileUtils.writeByteArrayToFile erstellt die Datei (und den vollständigen Pfad) für den Fall, dass sie nicht existiert, daher ist FileUtils.touch nicht erforderlich. –

2

Sie können durch Gießen tempfile im Frühjahr zugreifen, 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 weniger mit Dateien des Tricks loszuwerden als 10240 Bytes maxInMemorySize Eigenschaft kann auf 0 in @Configuration@EnableWebMvc Klasse gesetzt. 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; 
    } 
+1

'createNewFIle()' ist hier sinnlos und verschwenderisch. Sie verpflichten nun 'new FileOutputStream()' (über das OS) sowohl die so erstellte Datei zu löschen als auch * eine neue zu erstellen. – EJP

+0

@EJP ja, es war sinnlos, jetzt behebe ich diesen Fehler während der Bearbeitung. Aber createNewFIle() ist nicht verschwenderisch, weil wenn CommonsMultipartFile weniger als 10240 Byte ist, die Datei im Dateisystem nicht erstellt wird. Also sollte eine neue Datei mit einem eindeutigen Namen (ich habe den Namen von DiskFileItem verwendet) im FS erstellt werden. – Alex78191

+0

@ Alex78191 Was Sie meinen, implizit speichern Sie auf der Festplatte kleine Dateien (<10240 Bytes standardmäßig). Gibt es trotzdem, das Limit zu erhöhen –

8

Obwohl die akzeptierte Antwort ist richtig, aber wenn Sie nur versuchen, Ihr Bild hochladen cloudinary, gibt es einen besseren Weg:

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

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

1

Die Antwort von Alex78191 hat für mich 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; 
} 

Für Dateien mit einer Größe von mehr als 10240 Bytes bitte ändern Sie die maxInMemorySize in multipartResolver zu 1 MB hochladen.

<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

'maxInMemorySize' hat nichts mit der Beschränkung der Upload-Dateigröße zu tun. Die Größe des Datei-Uploads wird durch die Eigenschaft 'maxUploadSize' festgelegt. – Alex78191

+0

Um den Trick mit Dateien weniger als 10240 Bytes loszuwerden, kann 'maxInMemorySize' prop auf' 0' gesetzt werden. – Alex78191

+0

@ Alex78191 Ich habe das geändert und es hat für mich funktioniert. Ich habe Ihren Code zum Konvertieren der Datei verwendet. Also habe ich die Eigenschaften in der applicationcontext.xml geändert, um die Speicherbeschränkungen zu beseitigen. Und es funktioniert !!! –

0

kleine Korrektur auf @PetrosTsialiamanis Post, new File(multipart.getOriginalFilename()) diese Datei in Server-Standort erstellen, in dem irgendwann werden Sie Schreibberechtigungsprobleme für den Benutzer Gesicht, es ist nicht immer möglich, die Schreibberechtigung für jeden Benutzer, der durchführt Aktion. System.getProperty("java.io.tmpdir") erstellt Temp-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 die Datei oder den 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; 
} 

setzen Sie diese Methode in Ihrem gemeinsamen Dienstprogramm und verwenden Sie es wie für zB. Utility.multipartToFile(...)

Verwandte Themen