2017-09-12 4 views
3

Je suppose qu'il n'y a pas d'autre moyen pour créer un FileDateBodyPart que de fournir un objet de fichier:Jersey REST client - création multipart - et non de l'objet File

public FileDataBodyPart(String name, File fileEntity) 

Mais dans mon cas ce que j'ai est un octet [] et je ne veux pas le convertir en un fichier et stocker sur un système de fichiers.

Existe-t-il un autre moyen de générer un multipart (lors du téléchargement d'un fichier) à partir d'un tableau d'octets, d'inputstream ... dans le pire des cas, d'utiliser une autre bibliothèque client?

MISE À JOUR: Voici le code de travail (mais je veux utiliser byte [] au lieu de fichier):

FileDataBodyPart filePart = new FileDataBodyPart("attachment", new File("C:/TEMP/test.txt")); 
MultiPart multipart = new FormDataMultiPart().bodyPart(filePart); 
Invocation.Builder invocationBuilder = webTarget.request().accept(MediaType.APPLICATION_JSON); 
Response response = invocationBuilder 
     .buildPost(Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA)) 
     .invoke(); 
+0

La question est plutôt floue. Montrer plus de code. Quelles sont vos intentions? –

+0

La question est mise à jour. – Mark

Répondre

2

Il n'y a pas d'autre moyen pour FileDataBodyPart de ne pas accepter un fichier.

Pour contourner ce problème, vous pouvez créer un fichier temporaire et supprimer une fois que la machine virtuelle Java sort:

byte[] bytes = {1, 2, 3}; 

File tempFile = File.createTempFile("filename", null); 
tempFile.deleteOnExit(); 

FileOutputStream fos = new FileOutputStream(tempFile); 
fos.write(bytes); 
fos.close(); 

FileDataBodyPart filePart = new FileDataBodyPart("attachment", tempFile); 
+0

Oui, cela pourrait être une option. Merci. – Mark

2

FileDataBodyPart est juste une classe de commodité. Ce n'est pas le seul type que vous pouvez utiliser pour créer une partie du corps. Si vous regardez les documents pour FormDataMultuPart.bodyPart(), vous verrez qu'il prend comme argument un BodyPart. Consultez le Javadocs (recherchez-le, ne peut pas trouver le lien direct). Si vous recherchez BodyPart et traversez la hiérarchie, il y a quelques classes l'extension de BodyPart, comme FormDataBodyPart (le plus générique) et aussi StreamDataBodyPart. Vous pouvez utiliser l'un ou l'autre. Si vous avez un InputStream, le plus simple est d'utiliser le StreamDataBodyPart. Voir le javadoc, il a surchargé les constructeurs.

Si vous devez utiliser un byte[], alors vous pouvez simplement utiliser le plus générique FormDataBodyPart

byte[] bytes = "HelloWorld".getBytes(StandardCharsets.UTF_8); 
FormDataContentDisposition fdcd = FormDataContentDisposition.name("test") 
     .fileName("hello.txt").build(); 
FormDataBodyPart bodyPart = new FormDataBodyPart(fdcd, bytes, MediaType.TEXT_PLAIN_TYPE); 
MultiPart multiPart = new FormDataMultiPart().bodyPart(bodyPart); 

parties devraient avoir un en-tête Content-Disposition qui donnent un peu d'informations sur la partie, de sorte que le serveur peut gérer correctement. Le FileDataBodyPart et StreamDataBodyPart gèreraient la création du FormDataContentDisposition en interne, c'est pourquoi ils sont commodité classes.

+0

C'est mon choix. Je vous remercie. – Mark