La manipulation des pièces jointes en plusieurs parties dans CXF Api
Je suis en train de développer une API appel à l'aide de Apache CXF qui prend dans une pièce jointe à la demande. J'ai suivi cette tutoriel et c'est ce que j'ai obtenu jusqu'à présent.
@POST
@Path("/upload")
@RequireAuthentication(false)
public Response uploadWadl(MultipartBody multipartBody){
List<Attachment> attachments = multipartBody.getAllAttachments();
DataHandler dataHandler = attachments.get(0).getDataHandler();
try {
InputStream is = dataHandler.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return Response("OK");
}
Je reçois un InputStream objet de l'attachement et tout fonctionne bien. Cependant j'ai besoin de passer la pièce jointe en tant que java.io.Fichier objet à une autre fonction. Je sais que je peux créer un fichier ici, lire à partir de l'inputstream et écrire. Mais est-il une meilleure solution? A la CXF déjà stockées dans un Fichier? Si je pouvais juste aller de l'avant et de l'utiliser. Des suggestions?
OriginalL'auteur n3o | 2012-05-29
Vous devez vous connecter pour publier un commentaire.
Je suis également intéressé sur cette question. Tout en discutant avec Sergey sur le CXF liste de diffusion, j'ai appris que CXF est d'utiliser un fichier temporaire si la pièce jointe dépasse un certain seuil.
Dans le processus, j'ai découvert ce article sur le blog qui explique comment utiliser CXF de fixation en toute sécurité.
Vous pouvez être intéressé par l'exemple sur cette page.
C'est tout ce que je peux dire pour le moment que je recherche maintenant, j'espère que ça aide.
EDIT : pour le moment, voici comment nous nous occupons de l'attachement avec CXF 2.6.x. Sur le téléchargement d'un fichier à l'aide de plusieurs parties type de contenu.
Dans notre REPOS ressource, nous avons défini la méthode suivante :
Quelques notes sur ce morceau de code :
@Multipart
n'est pas standard pour JAXRS, il n'est même pas JAXRS 2, c'est une partie de CXF.MultipartBody
, la clé ici est d'utiliser un argument de typeAttachment
Donc oui, autant que nous sachions, il n'y a pas encore la possibilité d'obtenir directement le type que nous voulons dans la signature de la méthode. Donc par exemple si vous voulez simplement la
InputStream
de la pièce jointe ne peut pas le mettre dans la signature de la méthode. Vous devez utiliser leorg.apache.cxf.jaxrs.ext.multipart.Attachment
type et à écrire la déclaration suivante :Aussi nous avons découvert avec l'aide de Sergey Beryozkin que nous pourrions transformer ou de les emballer ce
InputStream
, c'est pourquoi, dans l'extrait ci-dessus, nous avons écrit :IncomingFile
est notre coutume wrapper autour de laInputStream
, pour que vous devez enregistrer unMessageBodyReader
,ParamHandler
ne va pas aider, car ils ne fonctionnent pas avec les flux mais avecString
.Remarque cependant qu'il y a eu quelques essais pour comprendre ce qui a été transmis, comment, et la manière de hot-fix de bugs (Par exemple la première lettre du premier en-tête de la pièce jointe partie a manger si vous avez eu
ontent-Type
au lieu deContent-Type
).Bien sûr, le
entityStream
représente leInputStream
de la pièce jointe. Ce flux va lire les données à partir de la mémoire ou de disque, selon l'endroit où CXF mettre les données ; il y a un seuil de taille de la propriété (attachment-memory-threshold
) pour cette question. Vous pouvez également dire où temporaire des pièces jointes (attachment-directory
).Il suffit de ne pas oublier de fermer le flux de données lorsque vous avez terminé (quelques outil de le faire pour vous).
Une fois que tout est configuré, nous avons testé avec Repos Assuré de Johan Haleby. (Code font partie de notre test utils) :
Ou si vous avez besoin de télécharger le fichier via curl dans une telle manière :
Pour terminer cette réponse, je tiens à mentionner qu'il est possible d'avoir une charge utile JSON en plusieurs parties, pour que vous puissiez utiliser une
Attachment
type dans la signature, et puis écrireOu vous pouvez écrire un argument comme :
Il suffit de ne pas oublier d'ajouter la
Content-Type
en-tête de la partie pertinente lors de l'exécution de la demande.Il pourrait être utile de dire qu'il est possible d'avoir toutes les pièces dans une liste, il suffit d'écrire une méthode avec un seul argument de type
List<Attachment>
. Cependant, je préfère avoir les arguments dans la signature de la méthode que c'est plus propre et moins passe-partout.OriginalL'auteur Brice