Upload de fichier avec un autre objet en Jersey de service web restful
Je veux créer un employé de l'information dans le système en téléchargeant une image avec les données de l'employé. Je suis en mesure de le faire avec différents appels de repos à l'aide de jersey. Mais je veux réaliser dans un appel reste.
- Je fournir en dessous de la structure. S'il vous plaît aider moi comment faire dans ce domaine.
@POST
@Path("/upload2")
@Consumes({MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response uploadFileWithData(
@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition contentDispositionHeader,
Employee emp) {
//..... business login
}
Chaque fois que je suis en train de faire, j'obtiens le message d'erreur dans google Chrome facteur. La structure simple de mon Employé json est donnée ci-dessous.
{
"Name": "John",
"Age": 23,
"Email": "[email protected]",
"Adrs": {
"DoorNo": "12-A",
"Street": "Street-11",
"City": "Bangalore",
"Country": "Karnataka"
}
}
Cependant je peux le faire en faisant deux appels différents, mais que je veux réaliser dans un appel reste afin que je puisse recevoir le fichier, ainsi que les données réelles de l'employé.
Demande de vous aider dans ce domaine.
- Pourriez-vous s'il vous plaît voter jusqu'/accepter de répondre comme il est détaillé dans le stackoverflow.com/help/someone-answers? Merci
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir deux
Content-Type
s (bien techniquement qu'est ce que nous faisons ci-dessous, mais ils sont séparés avec chaque partie de la multipart, mais le principal est de type multipart). C'est en gros ce qui vous attend avec votre méthode. Vous vous attendez à mutlipart et json ensemble comme le principal type de média. LeEmployee
de données doit être une partie de la multipart. Ainsi, vous pouvez ajouter un@FormDataParam("emp")
pour laEmployee
.Voici la classe que j'ai utilisé pour le test
D'abord je viens de tester avec l'API du client pour vérifier qu'il fonctionne
Je viens de créer un simple
Employee
classe avec unid
etname
champ pour les tests. Cela fonctionne parfaitement bien. Il montre l'image, les impressions de la disposition du contenu, et imprime leEmployee
objet.Je ne suis pas trop familier avec le Facteur, j'ai donc enregistré que des tests de la dernière 🙂
Il semble bien fonctionner aussi, comme vous pouvez le voir la réponse
"Cool Tools"
. Mais si l'on regarde l'impriméEmployee
de données, nous allons voir qu'il est nul. Ce qui est bizarre car avec le client API, il a bien fonctionné.Si l'on regarde la fenêtre d'Aperçu, nous allons voir le problème
Il n'y a pas
Content-Type
- tête pour lesemp
partie du corps. Vous pouvez le voir dans le client API, j'explicitement définieDonc je suppose que ce n'est vraiment que partie d'une réponse complète. Comme je l'ai dit, je ne suis pas familier avec le Facteur, Donc je ne sais pas comment définir
Content-Type
s pour les différentes parties du corps. Leimage/png
de l'image est automatiquement réglée pour moi pour la partie de l'image (je suppose que c'était simplement déterminé par l'extension du fichier). Si vous pouvez comprendre cela, alors le problème devrait être résolu. S'il vous plaît, si vous trouvez comment faire cela, poster une réponse.Et juste pour être complet,...
Configurations de base:
Dépendance:
De la configuration du Client:
Server config:
Mise à JOUR
Donc, comme vous pouvez le voir à la livraison client, certains clients sont incapables de fixer des pièces de' Content-Type, cela inclut le navigateur, en ce qui concerne par défaut capacités lors de l'utilisation de
FormData
(js).Nous ne pouvons pas attendre le client de trouver l'écart autour de cela, de sorte que ce que nous pouvons faire, c'est lors de la réception de données, de définir explicitement le Type de Contenu avant de la désérialisation. Par exemple
C'est un peu de travail supplémentaire pour obtenir le POJO, mais c'est une meilleure solution que de forcer le client à l'essayer et de trouver sa propre solution.
Apartés
c == client
. Et j'ai mis à jour le code. Je vous remercie.curl
?InputStream
paramètre. Seul le FormDataBodyPart est nécessaire pour le JSON partie parce que nous avons besoin de changer le type de média. Mais pour le fichier, il suffit d'obtenir le raw du flux d'entrée. Une autre façon est d'utiliser desbodyPart.getValueAs(InputStream.class)
, mais il n'est pas nécessaire. Il suffit de faire le paramètre d'uneInputStream
@BeanParam
comme indiqué ici pour combiner tous les champs d'une fève. Vous pouvez utiliser@FormDataParam
s dans la fève. Si vous le faites, alors le bean validation des travauxVotre ApplicationConfig devez vous inscrire à la MultiPartFeature.class de glassfish.jersey.les médias.. de manière à permettre un téléchargement de fichier
Je veux ajouter un commentaire sur peeskillet, mais n'ont pas de 50 points de réputation, d'où l'ajout d'une réponse:
Quand j'ai essayé @peeskillet solution avec Jersey client 2.21.1, il y avait erreur 400. Il a travaillé quand j'ai ajouté, à la suite de mon code client:
au lieu de figé MediaType.MULTIPART_FORM_DATA dans le post de demande d'appel.
multipartEntity.getMediaType()
. J'ai d'abord été en utilisantMediaType.MULTIPART_FORM_DATA
qui n'a pas ajouter de la frontière. Mais lorsque vous utilisez legetMediaType()
méthode de laMutliPart
, est ont la frontière.J'ai utilisé de téléchargement de fichiers exemple d',
http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/
dans ma classe de ressource que j'ai ci-dessous la méthode
dans mon attachService.java j'ai ci-dessous la méthode
dans Dao, j'ai
dans mon HBM cartographie est comme
Ce travail pour tous les types de fichiers comme .PDF,.TXT, .PNG, etc.,
Définir le "Content-Type: multipart/form-data" sur le côté client et que devrait faire le travail