Hochladen von mehreren Dateien und Metadaten mit CXF
Brauche ich um eine Datei zu erstellen upload-handler als REST web Services mit CXF. Ich habe in der Lage, eine einzelne Datei hochzuladen, mit Metadaten mithilfe von code wie dem folgenden:
@POST
@Path("/uploadImages")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadImage(@Multipart("firstName") String firstName,
@Multipart("lastName") String lastName,
List<Attachment> attachments) {
for (Attachment att : attachments) {
if (att.getContentType().getType().equals("image")) {
InputStream is = att.getDataHandler().getInputStream();
//read and store image file
}
}
return Response.ok().build();
}
Nun muss ich hinzufügen, Unterstützung für das hochladen von mehreren Dateien in der gleichen Anfrage. In diesem Fall, anstatt eine Anlage mit image/jpeg
Inhalte geben, bekomme ich eine Anlage mit multipart/mixed
Inhalte geben, die sich mit den einzelnen image/jpeg
Anlagen, die ich brauche.
Habe ich gesehen, Beispiele für das hochladen mehrerer JSON oder JAXB-Objekte mit Metadaten, aber ich habe nicht in der Lage gewesen, um alles zu erhalten zu arbeiten mit Binär-Bilddaten. Ich habe versucht, mit dem MultipartBody direkt, aber es gibt nur die multipart/mixed
Anlage, nicht die image/jpeg
Anlagen eingebettet.
Gibt es eine Möglichkeit, rekursiv analysiert eine multipart/mixed
Anlage, um die eingebetteten Anhänge? Ich kann natürlich den input-stream des multipart/mixed
Anlage und analysieren die Dateien selber, aber ich hoffe, dass es einen besseren Weg gibt.
UPDATE
Scheint dies kludgey, aber der folgende code ist gut genug für jetzt. Ich würde lieben zu sehen, eine bessere Weise aber.
for (Attachment att : attachments) {
LOG.debug("attachment content type: {}", att.getContentType().toString());
if (att.getContentType().getType().equals("multipart")) {
String ct = att.getContentType().toString();
Message msg = new MessageImpl();
msg.put(Message.CONTENT_TYPE, ct);
msg.setContent(InputStream.class, att.getDataHandler().getInputStream());
AttachmentDeserializer ad = new AttachmentDeserializer(msg, Arrays.asList(ct));
ad.initializeAttachments();
//store the first embedded attachment
storeFile(msg.getContent(InputStream.class));
//store remaining embedded attachments
for (org.apache.cxf.message.Attachment child : msg.getAttachments()) {
storeFile(child.getDataHandler().getInputStream());
}
}
else if (att.getContentType().getType().equals("image")) {
storeFile(att.getDataHandler().getInputStream());
}
}
- haben Sie versucht, zu definieren, die parameter wie final @Multipart("Bild") List<Attachment> Bilder oder ist es eher ein problem mit den content-Typen?
- Wenn ich einen Mehrteiligen Kommentar zu der Anhänge Liste CXF, passt einfach ein null-Wert. Ich lassen Sie es schmucklos, diese Bilder zu bekommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich bauen einen ähnlichen Dienst, um mehrere Bilder hochladen. Meine Implementierung sieht wie folgt aus (vielleicht hilft es)
wenn jemand lieber bye-arrays anstelle des input-streams, kann es konvertiert werden, leicht mit dieser Hilfsmethode