Последние 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());