当前位置: 首页 > 面试题库 >

Apache Camel-分段文件上传

宋涵忍
2023-03-14
问题内容

使用Apache-Camel ESB,尝试将xlsx文件上传到Spring Rest Web应用程序。从apache-camel
ESB上传失败。但是从Postman上传效果很好。下面共享代码段。

  1. 骆驼路由器中的处理器代码如下所示
            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();
  1. 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>
  1. 错误
            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)
  1. 当我们使用邮递员访问网络服务时,没有任何错误。能够成功上传服务器。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:当前请求不是多部分请求。

您需要设置正确的ContentType标题。如果您想以这种方式实现,请参考这个类似的问题以寻求解决方案。

但是,如果您切换co 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控制器中添加注释void?你不需要那个。



 类似资料:
  • 问题内容: 我正在使用Spring Boot,并且想要使用Controller来接收分段文件上传。发送文件时,我不断收到 错误415不支持的内容类型 响应,并且永不到达控制器 香港专业教育学院试图在HTML / jsp页面以及使用RestTemplate的独立客户端应用程序中使用form:action发送。所有尝试都给出相同的结果 从分段文档看来,必须将边界参数添加到分段上传中,但这似乎与控制器接

  • 我需要将文件从文件夹同步到restendpoint。因此,如果文件被放置在特定文件夹中,我需要将该文件发送到接受多部分文件的RESTendpoint。我正在使用ApacheCamel来实现这一点。 RESTendpoint在Spring中编写,如下所示: 我是Camel的新手,并且已经弄清楚了如何通过构建路由并获取文件来轮询目录,但是我无法弄清楚如何使用此路由将此文件放入其余endpoint。这是

  • 我希望上传一个包含一个文件和一些json的多部分文件,并使用camel rest dsl将该文件输出到本地文件夹。 我在路由中使用处理器,使用HttpServletRequest将多部分请求拆分为多个部分。getPart(),但我收到以下错误: 我已经向 servlet 添加了一个多部分筛选器,并且已经尝试了使用和不使用多部分解决方案 Bean。当我调试处理器时,我可以看到 HttpServlet

  • 本文向大家介绍java web上传文件和下载文件代码片段分享,包括了java web上传文件和下载文件代码片段分享的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java web上传文件和下载文件的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我正在尝试向异步路由发送消息,但它不起作用。我刚刚在github上创建了一个项目来模拟这个问题

  • 我试着在GXT中制作一个表单来上传文件,但我在网上看到了更多的例子,我没能用一个简单的FileUploadField将文件保存在本地 Cde片段: 上面的代码是FormPanel和FileUploadField的声明。