Java : InputStream zu Multi-part-Datei-Konvertierung, Ergebnis-Datei ist leer
Arbeite ich an einer Java-Anwendung, in der ich bin versuchen, um eine Multipart-Datei aus der heruntergeladenen InputStream. Leider, es funktioniert nicht, und die Multipart-Datei ist leer. Ich überprüfte die Größe des savedFile auf der Festplatte vor dem kopieren in Multipart, und es hat die richtige Größe, Attribute, Inhalt.
Was mache ich falsch bei der Umwandlung, es gibt keinen stacktrace, wie ich bin, fangen Sie.
Code :
//InputStream contains file data.
byte[] bytes = IOUtils.toByteArray(inputStream);
File file = new File(msg + "temp");
if (file.exists() && file.isDirectory()) {
OutputStream outputStream = new FileOutputStream(new File(msg + "temp" + "/" +
groupAttachments.getFileName()));
outputStream.write(bytes);
outputStream.close();
}
java.io.File savedFile = new java.io.File(msg + "temp" + "/" +
groupAttachments.getFileName());
DiskFileItem fileItem = new DiskFileItem("file", "text/plain", false,
savedFile.getName(), (int) savedFile.length(), savedFile.getParentFile());
fileItem.getOutputStream();
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.println("Saved file size is "+savedFile.length());
if (multipartFile.isEmpty()) {
System.out.println("Dropbox uploaded multipart file is empty");
} else {
System.out.println("Multipart file is not empty.");
}
this.dropboxTask.insertFile(multipartFile, "",
savedPersonalNoteObject.getNoteid(), (long) 0, true);
Path path = Paths.get(msg + "temp" + "/" + groupAttachments.getFileName());
Ausgabe der Konsole :
Multipart file is not empty
Bytes are not null
File path is /My Group
Input stream is not null
Saved file size is 4765
Dropbox uploaded multipart file is empty
Multipart file is empty
Bytes are not null
Was mache ich falsch bei der Konvertierung? Jede Hilfe wäre nett. Vielen Dank.
Irgendwelche Ideen, Jungs..
InformationsquelleAutor We are Borg | 2015-11-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
DiskFileItem
verwendet eineDeferredFileOutputStream
was nutzt eine in-memory-byte-array, das ist nur gefüllt, wenn die bytes tatsächlich übertragen wird.Da die Dateien direkt verwendet werden, und keine bytes werden tatsächlich kopiert,
das byte-array wird nie gefüllt. Sehen Sie selbst im source-code:
Quellcode CommonsMultipartFile
Quellcode DiskFileItem
Quellcode DeferredFileOutputStream
Also, anstatt nur mitzugehen
fileItem.getOutputStream();
transfer der bytes zu füllen, die in-memory-byte-array:und dann die
tranferTo
Aufruf funktioniert.Dies erscheint ein wenig umständlich für nur verschieben einer Datei:
CommonsMultipartFile
nur AnrufefileItem.write((File)dest)
imtransferTo
Methode.Unten sind zwei Testfälle, mit dem
DiskFileItem
und eins, dasLocalFileItem
. Der code fürLocalFileItem
ist weiter unten gezeigt.Ich verwendet Abhängigkeiten
org.springframework:spring-web:4.2.2.RELEASE
,commons-fileupload:commons-fileupload:1.3.1
undjunit:junit:4.12
Test-Klasse
CommonMp
:Benutzerdefinierte
LocalFileItem
Klasse, YMMV!InformationsquelleAutor vanOekel