Загрузка нескольких файлов и метаданных с помощью CXF

Мне нужно создать обработчик загрузки файлов в виде веб-службы REST с помощью CXF. Я смог загрузить один файл с метаданными, используя следующий код:

@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();
}

Теперь мне нужно добавить поддержку загрузки нескольких файлов в одном запросе. В этом случае вместо вложения с типом контента image / jpeg я получаю вложение с типом контента multipart / mixed , которое сам содержит отдельные вложения image / jpeg , которые мне нужны.

Я видел примеры загрузки нескольких объектов JSON или JAXB с метаданными, но мне не удалось заставить что-либо работать с двоичным изображением Я пробовал использовать MultipartBody напрямую, но он возвращает только вложение multipart / mixed , а не вложенные в него вложения image / jpeg .

Есть ли способ сделать это. рекурсивно проанализировать вложение multipart / mixed , чтобы получить встроенные вложения? Конечно, я могу получить входной st пачку multipart / mixed вложения и сам разбираю файлы, но я надеюсь, что есть способ получше.

ОБНОВЛЕНИЕ

Это кажется глупым, но следующий фрагмент кода пока достаточно хорош. Я бы хотел увидеть лучший способ.

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());
    }
}
6
задан Jason Day 18 January 2012 в 18:48
поделиться