gpt4 book ai didi

spring-mvc - Apache Camel - 分段文件上传

转载 作者:行者123 更新时间:2023-12-02 03:18:44 25 4
gpt4 key购买 nike

使用 Apache-Camel ESB,尝试将 xlsx 文件上传到 Spring Rest Web 应用程序。从 apache-camel ESB 上传失败。但从 postman 上传工作正常。下面共享代码片段。

  1. Camel 路由器中的处理器代码如下所示

        from("file://data/PASInput").process(new Processor() {
    @Override
    public void process(Exchange exchange) throws Exception {

    MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
    multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    String filename = (String) exchange.getIn().getHeader(Exchange.FILE_NAME);
    File file = exchange.getIn().getBody(File.class);
    multipartEntityBuilder.addPart("file",
    new FileBody(file, ContentType.MULTIPART_FORM_DATA, filename));
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    multipartEntityBuilder.build().writeTo(out);
    InputStream inputStream = new ByteArrayInputStream(out.toByteArray());
    exchange.getOut().setBody(inputStream);
    }
    }).to("http://localhost:8080/Pastel/api/convertor/pas/pastel")
    .log(LoggingLevel.ERROR, "RESPONSE BODY ${body}").end();
  2. Pom.xml

        <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <version>2.21.0.fuse-000077-redhat-1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
    <version>2.21.0.fuse-000077-redhat-1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http</artifactId>
    <version>2.21.0.fuse-000077-redhat-1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http4</artifactId>
    <version>2.17.2</version>
    </dependency>
  3. 错误

        org.apache.camel.http.common.HttpOperationFailedException: HTTP operation failed invoking http://localhost:8080/Pastel/api/convertor/pas/pastel with statusCode: 500
    at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:274)
    at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:183)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:452)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:219)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:183)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  4. 当我们使用 postman 访问网络服务时,没有错误。能够成功上传服务器。 Spring mvc代码,

                @RequestMapping(value = "/pas/pastel", method = RequestMethod.POST)
    @ResponseBody
    public void convertPASToPastel(HttpServletRequest request, HttpServletResponse response,
    @RequestParam(value = "file") final MultipartFile pasFile) {
    try {
    System.out.print("Here");
    }
    }

最佳答案

您可能会在 Spring 后端日志中看到此错误消息:

org.springframework.web.multipart.MultipartException: Current request is not a multipart request.

您需要设置正确的ContentType header 。请引用this类似的问题的解决方案,如果你想以这种方式实现它。

<小时/>

但是如果你换个公司,你就可以摆脱这个困惑的局面 camel-http4组件(您已经在 pom.xml 中拥有此组件)。该组件包含用于转换 HttpEntity 的逻辑至InputStream 。然后就可以设置HttpEntity直接交换本体。

那么你的路线将如下所示:

from("file://data/PASInput").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
String filename = exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
File file = exchange.getIn().getBody(File.class);
multipartEntityBuilder.addPart("file",
new FileBody(file, ContentType.MULTIPART_FORM_DATA, filename));
exchange.getOut().setBody(multipartEntityBuilder.build());
}
}).to("http4://localhost:8080/Pastel/api/convertor/pas/pastel")
.log(LoggingLevel.ERROR, "RESPONSE BODY ${body}").end();
<小时/>

只是一个注释。 切勿混合组件版本,组件始终使用与 Apache Camel 版本相同的版本。否则你会看到不可预测的结果。以及为什么你有注释 @ResponseBody在Spring Controller 中,当方法为void时?你不需要那个。

关于spring-mvc - Apache Camel - 分段文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56942540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com