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.
InformationsquelleAutor Jason Day | 2012-01-18
Schreibe einen Kommentar