Kann mir jemand sagen, wie eine mehrteilige Datei (org.springframework.web.multipart.MultipartFile) am besten in eine Datei (java.io.File) konvertiert werden kann?
In meinem mvc-Webprojekt im Frühjahr erhalte ich eine hochgeladene Datei als mehrteilige Datei. Ich muss sie in eine Datei (io) konvertieren, daher kann ich diesen Bildspeicherdienst ( Cloudinary ) aufrufen. Sie nehmen nur den Typ (Datei).
Ich habe so viele Suchvorgänge durchgeführt, die jedoch fehlgeschlagen sind. Wenn jemand einen guten Standardweg kennt, lassen Sie es mich bitte wissen. Danke
java
spring
spring-mvc
file-upload
cloudinary
Amila Iddamalgoda
quelle
quelle
MultipartFile.transferTo()
?Antworten:
Sie können den Inhalt von a
MultipartFile
mithilfe dergetBytes
Methode abrufen und in die Datei schreiben, indem SieFiles.newOutputStream()
:Sie können auch die transferTo-Methode verwenden :
quelle
createNewFIle()
ist hier sowohl sinnlos als auch verschwenderisch. Sie verpflichten sich jetztnew FileOutputStream()
(über das OS) , um sowohl die Datei zu löschen , so erstellt und eine neue erstellen.Die akzeptierte Antwort ist zwar richtig, aber wenn Sie nur versuchen, Ihr Bild in Cloudinary hochzuladen, gibt es einen besseren Weg:
Wobei multipartFile Ihr org.springframework.web.multipart.MultipartFile ist .
quelle
Bei einer kleinen Korrektur des Beitrags @PetrosTsialiamanis
new File( multipart.getOriginalFilename())
wird eine Datei am Serverstandort erstellt, bei der manchmal Probleme mit der Schreibberechtigung für den Benutzer auftreten. Es ist nicht immer möglich, jedem Benutzer, der eine Aktion ausführt, eine Schreibberechtigung zu erteilen.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 eine Datei erstellt wird. Später können Sie eine Datei oder einen temporären Ordner löschen.Setzen Sie diese Methode in Ihr allgemeines Dienstprogramm ein und verwenden Sie sie wie z.
Utility.multipartToFile(...)
quelle
Sie können auch die Apache Commons IO- Bibliothek und die FileUtils-Klasse verwenden . Wenn Sie maven verwenden, können Sie es mit der oben genannten Abhängigkeit laden.
Die Quelle für die MultipartFile-Speicherung auf der Festplatte.
quelle
FileUtils.touch()
ist hier sowohl sinnlos als auch verschwenderisch. Sie verpflichten sich jetztnew FileOutputStream()
(über das OS) , um sowohl die Datei zu löschen , so erstellt und eine neue erstellen.MultipartFile.transferTo (File) ist nett, aber vergessen Sie nicht, die temporäre Datei zu bereinigen.
Lesen Sie den Kommentar von Razzlero zu File.deleteOnExit (), der beim Beenden der JVM ausgeführt wird (was äußerst selten sein kann).
quelle
deleteOnExit()
wird nur ausgelöst, wenn die JVM beendet wird, sodass sie während Ausnahmen nicht ausgelöst wird. Aus diesem Grund müssen SiedeleteOnExit()
bei lang laufenden Anwendungen wie Serveranwendungen vorsichtig sein . Bei Serveranwendungen wird die JVM selten beendet. Sie müssen also vorsichtig seindeleteOnExit()
, um Speicherlecks zu verursachen. Die JVM muss alle Dateien verfolgen, die beim Beenden gelöscht werden müssen und die nicht gelöscht werden, da die JVM nicht beendet wird.quelle
Sie können im Frühjahr zugreifen tempfile durch Gießen , wenn die Klasse der Schnittstelle
MultipartFile
istCommonsMultipartFile
.Um den Trick mit Dateien mit weniger als 10240 Byte loszuwerden,
maxInMemorySize
kann die Eigenschaft in der@Configuration
@EnableWebMvc
Klasse auf 0 gesetzt werden . Danach werden alle hochgeladenen Dateien auf der Festplatte gespeichert.quelle
createNewFIle()
ist hier sowohl sinnlos als auch verschwenderisch. Sie verpflichten sich jetztnew FileOutputStream()
(über das OS) , um sowohl die Datei zu löschen , so erstellt und eine neue erstellen.Die Antwort von Alex78191 hat bei mir funktioniert.
Zum Hochladen von Dateien mit einer Größe von mehr als 10240 Byte ändern Sie bitte die maxInMemorySize in multipartResolver auf 1 MB.
quelle
maxInMemorySize
hat nichts mit der Beschränkung der Größe des Datei-Uploads zu tun. Die Größe des Datei-Uploads wird von dermaxUploadSize
Eigenschaft festgelegt.maxInMemorySize
kann prop auf gesetzt werden0
.Wenn Sie MultipartFile.transferTo () nicht verwenden möchten. Sie können eine Datei wie diese schreiben
quelle