2015-03-02 132 views
1

我试图通过Apache Camel将文件路由到HTTP文件上传API。但我得到以下例外Apache骆驼多部分路由

org.apache.camel.InvalidPayloadException: No body available of type: java.io.InputStream but has value: [email protected] of type: org.apache.http.entity.mime.MultipartFormEntity on: [email protected] Caused by: No type converter available to convert from type: org.apache.http.entity.mime.MultipartFormEntity to the required type: java.io.InputStream with value [email protected] Exchange[[email protected]]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: org.apache.http.entity.mime.MultipartFormEntity to the required type: java.io.InputStream with value [email protected]] 

任何人都可以在这里帮助吗? 以下是我试过到目前为止

我的文件上传控制方法与URL映射的API /文件上传需要一个MultipartHttpServletRequest

MyCamelRouter.java

public class MyCamelRouter extends RouteBuilder { 

@Override 
public void configure() throws Exception { 
    from("file:C:/src") 
     .process(new MyProcessor()) 
     .log("POST ${header.CamelFileName} to /upload") 
     .setHeader(Exchange.CONTENT_TYPE, constant("multipart/form-data")) 
     .setHeader(Exchange.HTTP_METHOD, constant("POST")) 
     .to("http:localhost:8080/sampleUploader/api/fileupload") 
     .log("HTTP response status: ${header.CamelHttpResponseCode}") 
     .log(LoggingLevel.DEBUG, "HTTP response body:\n${body}"); 
} 

}

和MyProcessor.java

public class MyProcessor implements Processor { 
    public void process(Exchange exchange) throws Exception { 

     File filetoUpload = exchange.getIn().getBody(File.class); 
     String fileName = exchange.getIn().getHeader(Exchange.FILE_NAME, String.class); 

     MultipartEntityBuilder entity = MultipartEntityBuilder.create(); 
     entity.addTextBody("fileName", fileName); 
     entity.addBinaryBody("file", new File(filePath)); 

     exchange.getOut().setBody(entity.build()); 
    } 

}

This是我跟着链接,这个(斯卡拉DSL)

+0

我的回答可以帮助您? – Panchitoboy 2015-03-06 10:56:49

+0

@Panchitoboy是的我设法用HTTPClient在外部发布请求。非常感谢您的帮助... – 2015-03-09 18:03:09

回答

2

的信息是明确的,当它说,你需要一个InputStream

的方法构建返回HttpEntity。

http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntityBuilder.html

您可以用该方法的getContent()尝试

http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/HttpEntity.html?is-external=true

试图改变自己:

exchange.getOut().setBody(entity.build()); 

到:

exchange.getOut().setBody(entity.build().getContent()); 

UPDATE

您的评论,你可以做其他的事情以后是:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
entity.build().writeTo(out); 
InputStream inputStream = new ByteArrayInputStream(out.toByteArray()); 
exchange.getOut().setBody(inputStream); 
+0

感谢您的回复。我尝试了你的建议,但我得到以下异常'java.lang.UnsupportedOperationException:多部分表单实体没有实现#getContent()'有没有其他方法? – 2015-03-03 12:56:34

+0

我编辑了我的答案 – Panchitoboy 2015-03-03 13:09:48

+0

现在我可以将请求发送到API。但我认为它不包含实际的文件。请参阅 以下的API实现'public void handleFileUpload(MultipartHttpServletRequest request){ Iterator itrator = request.getFileNames(); MultipartFile multipartFile = request.getFile(itrator.next()); }' 当请求在这里收到时在这种情况下'itrator'不提供迭代的文件,所以我无法获取我的服务器中的文件。我能在这里做什么?请帮忙 – 2015-03-04 17:43:45