Как скачать несколько файлов с помощью JSON, используя один запрос с OpenLiberty - PullRequest
0 голосов
/ 13 июня 2019

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

У кого-нибудь есть подсказки?

...