Вариант использования определяет загрузку нескольких файлов вместе с некоторыми json в Java с использованием OpenLiberty 19.0.0.5
На самом деле в OpenLiberty можно использовать IMultipartBody в качестве параметра для службы REST. Я могу использовать файлы, а также JSON. Но когда дело доходит до отправки составного сообщения, у меня возникают всевозможные проблемы.
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(IMultipartBody multipartBody) {
public Response postFormData(IMultipartBody multipartBody) {
FileOutputStream outputStream=null;
List<IAttachment> attachments = multipartBody.getAllAttachments();
InputStream stream = null;
String fileKey = null;
FileOutputStream fileOutputStream = null;
for (Iterator<IAttachment> it = attachments.iterator(); it.hasNext(); ) {
IAttachment attachment = it.next();
if (attachment == null) {
continue;
}
DataHandler dataHandler = attachment.getDataHandler();
try {
stream = dataHandler.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
MultivaluedMap<String, String> map = attachment.getHeaders();
String contentDisposition = map.getFirst("Content-Disposition");
if (contentDisposition != null && contentDisposition.toLowerCase().contains("filename=")) {
<write stream to file and do work>
<how can I send back a file using multipartBody>
}
}
return Response.ok(multipartBody).build();
}
}
Я хотел бы отправить поток обратно в mulitpartBody, но не могу найти какой-либо способ, позволяющий мне это сделать.
Когда я использую SOAPUI для тестирования службы и прикрепляю файл к запросу и использую в качестве типа носителя multipart/form-data
, я получаю следующий ответ:
HTTP/1.1 200 OK
X-Powered-By: Servlet/4.0
Content-Type: multipart/form-data; boundary="uuid:082bc4df-b829-4ec0-80d1-6a3c059b88a7"
Date: Mon, 17 Jun 2019 07:52:15 GMT
Content-Language: en-US
Content-Length: 325
--uuid:082bc4df-b829-4ec0-80d1-6a3c059b88a7
Content-Type: application/octet-stream;name=global-groovy.log
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
Content-Disposition: form-data; name="global-groovy.log"; filename="global-groovy.log"
--uuid:082bc4df-b829-4ec0-80d1-6a3c059b88a7--
Итак, ответ возвращается, но без файла, как я могу отправить файл обратно?
Известен ли способ использования составных сообщений в качестве ответа?
Я нашел другой способ отправки с использованием "multipart/mixed"
данных назад, но я не уверен, что это намерение сообщества открытой свободы:
@POST
@Consumes("multipart/form-data")
@Produces("multipart/mixed")
public Response postFormData(IMultipartBody multipartBody) {
FileOutputStream outputStream=null;
List<IAttachment> attachments = multipartBody.getAllAttachments();
InputStream stream = null;
String fileKey = null;
FileOutputStream fileOutputStream = null;
for (Iterator<IAttachment> it = attachments.iterator(); it.hasNext(); ) {
IAttachment attachment = it.next();
if (attachment == null) {
continue;
}
DataHandler dataHandler = attachment.getDataHandler();
try {
stream = dataHandler.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
MultivaluedMap<String, String> map = attachment.getHeaders();
String contentDisposition = map.getFirst("Content-Disposition");
if (contentDisposition != null && contentDisposition.toLowerCase().contains("filename=")) {
// <write the file and process it>
}
}
//https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Multiparts#JAX-RSMultiparts-Writingattachments
Map<String, Object> map = new LinkedHashMap<>();
map.put("application/json", "{\"menu\": {\"id\": \"file\",\"value\": \"File\"}}");
try {
final File file = new File("myFile");
map.put("application/octet-stream", Files.newInputStream(file.toPath()));
} catch (IOException e) {
e.printStackTrace();
}
return Response.ok(map).build();
}
}
У кого-нибудь есть подсказки?