Мне нужно создать обработчик загрузки файлов в качестве веб-службы 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
для получения встроенноговложения?Конечно, я могу получить входной поток вложения 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());
}
}