Tôi cần tạo trình xử lý tải tệp lên làm dịch vụ web REST với CXF. Tôi đã có thể tải lên một tệp có siêu dữ liệu bằng cách sử dụng mã như sau:Tải lên nhiều tệp và siêu dữ liệu với 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();
}
Bây giờ tôi cần thêm hỗ trợ tải lên nhiều tệp trong cùng một yêu cầu. Trong trường hợp này, thay vì tệp đính kèm với image/jpeg
loại nội dung, tôi nhận được tệp đính kèm với multipart/mixed
loại nội dung, chính nó chứa các tệp đính kèm image/jpeg
riêng lẻ mà tôi cần.
Tôi đã xem các ví dụ về tải lên nhiều đối tượng JSON hoặc JAXB với siêu dữ liệu, nhưng tôi không thể nhận được bất kỳ thứ gì để làm việc với dữ liệu hình ảnh nhị phân. Tôi đã thử sử dụng trực tiếp MultipartBody, nhưng nó chỉ trả về tệp đính kèm multipart/mixed
, không phải đính kèm tệp đính kèm image/jpeg
bên trong nó.
Có cách nào phân tích đệ quy một tệp đính kèm multipart/mixed
để nhận các tệp đính kèm được nhúng không? Tất nhiên tôi có thể lấy luồng đầu vào của tệp đính kèm multipart/mixed
và tự phân tích các tệp, nhưng tôi hy vọng có một cách tốt hơn.
CẬP NHẬT
Điều này có vẻ kludgey, nhưng các bit mã sau đây là đủ tốt cho bây giờ. Tôi rất thích nhìn thấy một cách tốt hơn.
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());
}
}
Bạn đã cố gắng xác định các tham số giống như cuối cùng @Multipart ("hình ảnh") Danh sách hình ảnh hoặc có vấn đề gì hơn với các loại nội dung không? –
AxelTheGerman
@axel Nếu tôi thêm chú thích Multipart vào danh sách đính kèm CXF, chỉ cần chuyển một giá trị null. Tôi phải để nó undecorated để có được những hình ảnh. –