Spring 文件上传的 Camel Rest 路由问题
Spring Camel Rest route problem with file upload
过去 2 天我一直在为以下问题苦苦挣扎。我正在尝试通过 POST 路径上传一个 csv 文件。从 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 时,当我接触骆驼 body 时它总是 null,我想是因为我没有't/can不使用@RequestPart 注释。
我的问题是现有的解析保留了文件末尾的 multipart/form-data 边界,破坏了任何后续发生的 csv 解析。下面是邮递员生成的边界。
----------------------------521923768224522097053873--
感谢任何帮助,非常感谢!
[编辑]
使用@karine 的解决方案,我确实得到了 thr clean body 并事先保留了文件名。最终休息路线如下:
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());
您可以尝试用以下方法替换您的 .process
方法!
.process(exchange -> {
String strMessage = FileUtils.readFileToString(
new File(yourFileName), StandardCharsets.UTF_8);
exchange.getMessage().setBody(strMessage);
exchange.getMessage().setHeader(Exchange.FILE_NAME, yourFileName);
})
这是我检索上传文件内容的方法
...
.post()
.bindingMode(RestBindingMode.off)
.route()
.routeId("postUploadForm")
.unmarshal().mimeMultipart()
.process((exchange) -> {
InputStream is = exchange.getIn().getBody(InputStream.class);
// is contains the content file
...
})
但是通过这种方式,我无法获取文件名。
希望能有点帮助
过去 2 天我一直在为以下问题苦苦挣扎。我正在尝试通过 POST 路径上传一个 csv 文件。从 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 的
我的问题是现有的解析保留了文件末尾的 multipart/form-data 边界,破坏了任何后续发生的 csv 解析。下面是邮递员生成的边界。
----------------------------521923768224522097053873--
感谢任何帮助,非常感谢!
[编辑]
使用@karine 的解决方案,我确实得到了 thr clean body 并事先保留了文件名。最终休息路线如下:
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());
您可以尝试用以下方法替换您的 .process
方法!
.process(exchange -> {
String strMessage = FileUtils.readFileToString(
new File(yourFileName), StandardCharsets.UTF_8);
exchange.getMessage().setBody(strMessage);
exchange.getMessage().setHeader(Exchange.FILE_NAME, yourFileName);
})
这是我检索上传文件内容的方法
...
.post()
.bindingMode(RestBindingMode.off)
.route()
.routeId("postUploadForm")
.unmarshal().mimeMultipart()
.process((exchange) -> {
InputStream is = exchange.getIn().getBody(InputStream.class);
// is contains the content file
...
})
但是通过这种方式,我无法获取文件名。 希望能有点帮助