camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Roman Vottner <r...@gmx.at>
Subject Re: REST DSL process multipart/form-data binary file?
Date Mon, 02 Oct 2017 09:41:20 GMT
How do you send data to your application? Have you specified a Content-Disposition header for
the respective parts?

We analysed a raw request via wireshark and it does look something like this:

GET /api/someResource HTTP/1.1
Host: www.somewhere.com <http://www.somewhere.com/>
…
Content-Type: multipart/form-data; boundary=------------------------d9c950f09cd11bba

--------------------------d9c950f09cd11bba
Content-Disposition: form-data; name="dat1"; filename=„SomeFile.zip"
Content-Type: application/octet-stream

…

--------------------------d9c950f09cd11bba
Content-Disposition: form-data; name="dat2"; filename=„SomeOtherFile.zip"
Content-Type: application/octet-stream

…


We use Camel 2.19.0 and the Undertow version Camel (camel-undertow-starter) and/or Spring-Boot
(spring-boot-starter-undertow) includes their dependencies (undertow 1.4.13.FINAL). 


> Am 02.10.2017 um 04:25 schrieb Mark Webb [via Camel] <ml+s465427n5814065h66@n5.nabble.com>:
> 
> Thanks for the example.  I cannot get your code working though.  I get the 
> following: 
> 
> [qtp1422312468-17] HandleUpload                   INFO  Upload received 
> [ qtp1422312468-17] HandleUpload                   INFO  Exchange body: 
> org.apache.camel.converter.stream.InputStreamCache@1cf48789 
> [qtp1422312468-17] HandleUpload                   INFO  Attachment size: 0 
> [qtp1422312468-17] HandleUpload                   INFO  Attachment object 
> size: 0 
> [qtp1422312468-17] HandleUpload                   WARN  No attachments 
> found! 
> 
> I am testing with the Postman app in the Chrome Browser and using Jetty. 
> I'm using Camel 2.16.2, since we're deploying in ServiceMix.   I tried 
> testing with Camel 2.19.3 and observed the same problem so I don't think a 
> newer version of Camel fixes things.  What environment are you running your 
> code inside? 
> 
> 
> 
> 
> 
> On Sat, Sep 30, 2017 at 9:13 PM, Roman Vottner <[hidden email] <x-msg://5/user/SendEmail.jtp?type=node&node=5814065&i=0>>
wrote: 
> 
> > Our Camel REST DSL configuration looks like this: 
> > 
> >     onException(Exception.class) 
> >         .handled(true) 
> >         .logExhausted(false) 
> >         .log(LoggingLevel.ERROR, ">> In default/message exception handler.

> > ${exception}, message: ${exception.message}, stacktrace: 
> > ${exception.stacktrace}") 
> >         .onRedelivery((Exchange exchange) -> LOG.debug(">> Default 
> > exception handler")) 
> >         .bean(PrepareErrorResponse.class).id("ErrorResponse") 
> >         .end(); 
> > 
> >     restConfiguration() 
> >         .component("undertow") 
> >         .port("{{server.port}}") 
> >         .contextPath("/api") 
> >         .endpointProperty("matchOnUriPrefix", "true") 
> >         .endpointProperty("sendServerVersion", "false") 
> >         .endpointProperty("chunked", "true"); 
> > 
> > where the actual route handling the multipart-request does look something 
> > along the line: 
> > 
> >     rest("/someEndpoint") 
> >         .post("/{id}") 
> >         .consumes(MediaType.MULTIPART_FORM_DATA_VALUE) 
> >         .route().routeId("upload-multipart-route") 
> >           // Spring Security authentication check via Authorization header 
> >           .bean(SpringSecurityContextLoader.class) 
> >               .policy(authorizationPolicy) 
> >           .log("Uploading to resource id ${header.id}") 
> >           .log(LoggingLevel.INFO, LOG, CONFIDENTIAL,"Headers: ${headers}") 
> >           .bean(HandleUpload.class) 
> >           .process((Exchange exchange) -> { 
> >             exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200); 
> >             exchange.getIn().setHeader(Exchange.CONTENT_TYPE, 
> > MediaType.APPLICATION_JSON_UTF8_VALUE); 
> >             ... 
> >           }) 
> >     .endRest(); 
> > 
> > and the HandleUpload class looking something like this: 
> > 
> > public class HandleUpload { 
> > 
> >   private static final Logger LOG = LoggerFactory.getLogger(Method 
> > Handles.lookup().lookupClass()); 
> > 
> >   @Autowired 
> >   private SomeRepository someRepository; 
> > 
> >   @Handler 
> >   public void processUpload(@Attachments Map<String, DataHandler> 
> > attachments, 
> >                             @Header("Content-Type") String contentType, 
> >                             @Header("id") String id, 
> >                             Exchange exchange) 
> >       throws Exception { 
> >     LOG.info("Upload received"); 
> > 
> >     LOG.info("Exchange body: " + exchange.getIn().getBody()); 
> >     LOG.info("Attachment size: " + (attachments == null ? 0 : 
> > attachments.size())); 
> >     LOG.info("Attachment object size: " + (exchange.getIn().getAttachmentObjects()

> > == null ? 0 
> > : exchange.getIn().getAttachmentObjects().size())); 
> >     if (exchange.getIn().getAttachmentNames() != null) { 
> >       for (String name : exchange.getIn().getAttachmentNames()) { 
> >         LOG.info("Attachment name: " + name); 
> >       } 
> >     } 
> > 
> >     if (contentType == null || !contentType.startsWith(MediaT 
> > ype.MULTIPART_FORM_DATA_VALUE)) { 
> >       LOG.warn("Unsupported media type!"); 
> >       throw new UnSupportedUploadMediaTypeException("Content-Type has to 
> > be 'multipart/form-data'"); 
> >     } 
> > 
> >     if (attachments.size() == 0) { 
> >       LOG.warn("No attachments found!"); 
> >     } else { 
> >       for (String key : attachments.keys()) { 
> >         LOG.info("Filename: " + key); 
> > 
> >         String uploadKey = id + "_" + new Date().toInstant().toEpochMilli() 
> > + "_" + 
> > attachments.get(key).getDataSource().getName(); 
> > 
> >         // stream data directly to a file to save memory footprint 
> >         File targetFile = new File(uploadKey); 
> >         try (OutputStream outStream = new FileOutputStream(targetFile, 
> > false)) { 
> >             attachments.get(key).writeTo(outStream); 
> >         } 
> > 
> >         ... 
> >       } 
> >     } 
> > 
> >     ... 
> >   } 
> > } 
> > 
> > Although we currently test Undertow, switching it with Jetty shouldn't be 
> > an issue. 
> > 
> > HTH, 
> > roman 
> > 
> > 
> > 
> > Am 01.10.2017 um 02:18 schrieb Mark: 
> > 
> >> I understand that, problem is that I can't figure out how to configure the 
> >> Camel Route to properly receive/parse the data.  If I was receiving 
> >> JSON/KML, this would be easy using the functionality in Camel.  Binary 
> >> files seem to be totally different. 
> >> 
> >> 
> >> On Sat, Sep 30, 2017 at 8:13 PM, Mark Nuttall <[hidden email] <x-msg://5/user/SendEmail.jtp?type=node&node=5814065&i=1>>

> >> wrote: 
> >> 
> >> it is just a file. any example of processing a file should work.  you will 
> >>> be able to save it somewhere and then you will have to call some 
> >>> processor 
> >>> to read/process it. 
> >>> 
> >>> On Fri, Sep 29, 2017 at 7:47 PM, Mark <[hidden email] <x-msg://5/user/SendEmail.jtp?type=node&node=5814065&i=2>>
wrote: 
> >>> 
> >>> I'm trying to figure out how to process a binary file that is sent to my

> >>>> Camel REST service via POST.  I have not found any good examples on
how 
> >>>> this can be done using Camel.  Does anyone have any experiences they

> >>>> 
> >>> could 
> >>> 
> >>>> share or links to more documentation? 
> >>>> 
> >>>> I'm currently using the jetty component for the restconfiguration. 
> >>>> 
> >>>> Thanks, 
> >>>> Mark 
> >>>> 
> >>>> 
> > 
> 
> 
> If you reply to this email, your message will be added to the discussion below:
> http://camel.465427.n5.nabble.com/REST-DSL-process-multipart-form-data-binary-file-tp5814059p5814065.html
<http://camel.465427.n5.nabble.com/REST-DSL-process-multipart-form-data-binary-file-tp5814059p5814065.html>
> To unsubscribe from Camel - Users, click here <http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=465428&code=cm92b0BnbXguYXR8NDY1NDI4fC04OTkzMjQ3MzM=>.
> NAML <http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message