2015-01-13 2 views
1

Я использую исходящую конечную точку http для вызова отдельной службы, которая должна обрабатывать файл, который отправляется в mule по многопрофильному запросу. Ниже приведен примерПересылка многопроходного запроса через mule esb

<http:outbound-endpoint connector-ref="serviceConnector" 
       address="http://${serviceHost}:${servicePort}/upload" 
       method="POST" 
       responseTimeout="${endpointTimeout}" 
       mimeType="multipart/form-data"> 

Проблема я имею что когда эту услугу называется я получаю FileUploadException о том, что запрос был отказаться, потому что ни многочастная граница не была найдена.

Я экспериментировал с этой проблемой и рассматривал разные вопросы, но ни один из них, похоже, не разрешил проблему.

Mule ESB and "multipart/form-data"

Mule http:outbound-endpoint + multipart/form-data

https://www.mulesoft.org/jira/browse/MULE-6917

Я также попытался изменения разъем, как описано в этом вопросе: Send file to Mule inbound-endpoint, но не повезло.

Любые идеи?

Благодаря

ответ

1

Наконец эта проблема была решена путем создания пользовательского процессора, который был разбор входящего запроса, разделив его на часть и вручную чтения байт ввода частей потока и установки считанных байтов в качестве источника данных, который прикреплен к сообщению. Код:

InputStream in = message.getPayload(InputStream.class); 
MultiPartInputStream multiIn = new MultiPartInputStream(in, contentType, null); 
try 
    { 
     Collection<Part> parts = multiIn.getParts(); 

     for (Part part : parts) 
     { 
      if (part instanceof MultiPart) 
       { 
        is = part.getInputStream(); 
        ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
        byte[] isByteArray = new byte[1024]; 
        int numberRead; 
        while ((numberRead = is.read(isByteArray)) != -1){ 
         buffer.write(isByteArray, 0, numberRead); 
        } 
        byte[] bytesRead = buffer.toByteArray(); 
        DataHandler attachment = new DataHandler(new ByteArrayDataSource(bytesRead, "application/octet-stream")); 
        message.addOutboundAttachment(part.getName(), attachment); 
       } 
     } 
    }...handle exceptions etc... 

Надеюсь, это поможет кому-то!

0

Вы не показывают достаточно вашего потока, чтобы быть действительно уверены, что это не хватает, но на первый взгляд, я бы сказал, что вы не установив атрибут boundary в исходящем заголовка запроса Content-Type.

Прочитайте следующее, чтобы лучше понять, как multipart/form-data запросов работы: http://chxo.com/be2/20050724_93bf.html

+0

Благодарим вас за ответ Дэвид! В потоке не так много осталось, кроме нескольких регистраторов и построителя ответов. Это значение заголовка 'Content-Type' в сообщении:' Content-Type = multipart/form-data; border = ---- WebKitFormBoundaryLzHwJdbCLdUuFvR2'. Я выполнил этот запрос от клиента postman rest, и я получаю ту же ошибку, что и граница не найдена. Есть ли что-нибудь особенное, которое я должен включить в поток моего мула, чтобы сделать запрос, отправленный из исходящего коннектора, идентичным тому, который приходит в мул? Спасибо! – Loshmeey

+1

Из того, что вы говорите, я считаю, что вам не хватает обработчика сообщений свойств копирования, чтобы скопировать заголовки HTTP, полученные во входящих свойствах, в исходящую область. См. Http://stackoverflow.com/a/6552437/387927 –

+0

После добавления процессора свойств копирования мне удалось опубликовать запрос - и получить другое исключение :). Сначала я попытался скопировать значения заголовков Content-Type и Content-Length, но в этом случае запрос был отключен, и если я копирую тип контента, то только запрос успешно отправлен, но tomcat возвращает ошибку: «Запрос, отправленный клиент был syNtactically неправильным ". Должен ли я копировать некоторые другие свойства заголовка? Я также попытался скопировать всю ценность http.headers, но он не дал никаких результатов. Благодаря! – Loshmeey