Проблема с маршрутом Spring Camel Rest при загрузке файла - PullRequest
0 голосов
/ 13 июля 2020

Последние 2 дня я боролся со следующей проблемой. Я пытаюсь загрузить файл csv через POST-маршрут. Файл выбирается для загрузки из формы html.

<form method="POST" action="uploadFile" enctype="multipart/form-data">
    <div>
        <div style="display:inline;">
            <label path="file">Select a file to upload</label>
        </div>
        <div style="display:inline;">
            <input type="file" name="file" />
        </div>
    </div>
    <div>
        <input type="submit" value="Submit" />
    </div>
</form>

Это POST-маршрут верблюда:

rest(properties.getRestEndpointPrefix() + properties.getRestEndpointUploadFileUrl())
    .post()
    .consumes(MediaType.MULTIPART_FORM_DATA_VALUE)
    .route()
    .routeId("postUploadForm")
    .process((exchange) -> {
        InputStream is = exchange.getIn().getBody(InputStream.class);
        Map<String, String> body = exchange.getIn().getBody(Map.class);
        MimeBodyPart mimeMessage = new MimeBodyPart(is);
        DataHandler dh = mimeMessage.getDataHandler();
        exchange.getIn().setBody(dh.getInputStream());
        exchange.getIn().setHeader(Exchange.FILE_NAME, dh.getName());
    })
    .to(properties.getIncomingUri());

Единственное решение, которое действительно сработало для меня, было Bedla из этого сообщение , используя MimeBodyPart. По какой-то причине всякий раз, когда я пытался использовать Spring MultiPart и children, он всегда был нулевым при обращении к телу верблюда, что, как я полагаю, связано с тем, что я не / не могу использовать аннотацию @RequestPart.

My проблема в том, что существующий синтаксический анализ сохраняет границу multipart / form-data в конце файла, нарушая любой последующий синтаксический анализ csv, который имеет место. Ниже приведена граница, созданная почтальоном.

---------------------------- 521923768224522097053873 -

Любая помощь приветствуется, заранее большое спасибо!

[EDIT]

Используя решение @karine, я получил чистое тело и заранее сохранил имя файла. Маршрут финального отдыха ниже:

rest(properties.getRestEndpointPrefix() + properties.getRestEndpointUploadFileUrl())
    .post()
    .consumes(MediaType.MULTIPART_FORM_DATA_VALUE)
    .route()
    .routeId("postUploadForm")
    .process((exchange) -> {
        //Keep the file name from the unmarshalled file. After unmarshalling, fileName will be lost
        MimeBodyPart mimeMessage = new MimeBodyPart(exchange.getIn().getBody(InputStream.class));
        exchange.getIn().setHeader(Exchange.FILE_NAME, mimeMessage.getDataHandler().getName());
    })
    .unmarshal()
    .mimeMultipart()
    .to(properties.getIncomingUri());

Ответы [ 2 ]

1 голос
/ 16 июля 2020

Вот способ получения содержимого файла загрузки

    ...
    .post()
     .bindingMode(RestBindingMode.off)
     .route()
        .routeId("postUploadForm")
        .unmarshal().mimeMultipart()
        .process((exchange) -> {
            InputStream is = exchange.getIn().getBody(InputStream.class);
            // is contains the content file
            ...
        })

Но таким способом я не могу получить имя файла. Надеюсь, это немного поможет

0 голосов
/ 13 июля 2020

вы можете попробовать, заменив свой .process метод следующим!

    .process(exchange -> {
        String strMessage = FileUtils.readFileToString(
                new File(yourFileName), StandardCharsets.UTF_8);
        exchange.getMessage().setBody(strMessage);
        exchange.getMessage().setHeader(Exchange.FILE_NAME, yourFileName);
    })
...