I'm sending the data right now using the Postman app in Chrome. My data comes across looking like this:
------WebKitFormBoundaryNZwE5GrXaeBuK9I9 Content-Disposition: form-data; name="fileUpload"; filename="nhc.kmz" Content-Type: application/vnd.google-earth.kmz [binary data] ------WebKitFormBoundaryNZwE5GrXaeBuK9I9 Content-Disposition: form-data; name="header1" value1 ------WebKitFormBoundaryNZwE5GrXaeBuK9I9-- On Mon, Oct 2, 2017 at 5:41 AM, Roman Vottner <r...@gmx.at> wrote: > 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+s465427n5814065...@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> >