Java : InputStream Multi-partie de conversion de fichier, le fichier est vide
Je suis en train de travailler sur une application Java dans lequel je suis en train de créer un fichier en plusieurs parties de téléchargé InputStream. Malheureusement, il ne fonctionne pas et le fichier en plusieurs parties est vide. J'ai vérifié la taille de savedFile sur le disque avant de le copier à plusieurs parties, et il a la bonne taille, attributs, le contenu.
Ce que je fais mal à la conversion, il n'y a pas de stacktrace, comme je suis à l'attraper.
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());
Sortie de la Console :
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
Ce que je fais mal à la conversion? Toute aide serait sympa. Merci beaucoup.
Toutes les idées les gars..
OriginalL'auteur We are Borg | 2015-11-10
Vous devez vous connecter pour publier un commentaire.
La
DiskFileItem
utilise unDeferredFileOutputStream
qui utilise une mémoire de tableau d'octets qui est rempli uniquement lorsque les octets sont effectivement transférés.Etant donné que les fichiers sont utilisés directement et sans octets sont réellement copiés,
le tableau d'octets n'est jamais rempli. Voyez par vous-même dans le code source:
Code Source CommonsMultipartFile
Code Source DiskFileItem
Code Source DeferredFileOutputStream
Ainsi, au lieu de simplement appeler
fileItem.getOutputStream();
, le transfert des octets de remplissage de la mémoire de tableau d'octets:et puis le
tranferTo
appel travail.Ce qui semble être un peu lourd pour le simple fait de déplacer un fichier:
CommonsMultipartFile
seuls les appelsfileItem.write((File)dest)
dans letransferTo
méthode.Ci-dessous, deux cas de test, à l'aide de la
DiskFileItem
et à l'aide de laLocalFileItem
. Le code pourLocalFileItem
est indiquée ci-dessous.J'ai utilisé les dépendances
org.springframework:spring-web:4.2.2.RELEASE
,commons-fileupload:commons-fileupload:1.3.1
etjunit:junit:4.12
Classe de Test
CommonMp
:La coutume
LocalFileItem
classe, YMMV!OriginalL'auteur vanOekel