使用ProducerTemplate.sendBodyAndHeader()
使用“文件”方案将文件发送到目的地,并且URI中的文件路径包含&符号时,无法传送出现以下错误的文件。
org.apache.camel.ResolveEndpointFailedException:无法解析端点: 文件:/// C%7C / IMM_SAN /营销/ f77333bd-f96f-4873-b846-2f1dc5531a5a / 2596 / PB&安培;Ĵ%20Generic%2007064782 /代码转换/ 21726 由于:无法解析端点: 文件:/// C%7C / IMM_SAN /营销/ f77333bd-f96f-4873-b846-2f1dc5531a5a / 25964 / PB&安培;Ĵ%20Generic%2007064782 /代码转换/ 21726 由于:uri语法无效:不是吗?然而,uri有&标记。参数分隔符。检查uri是否遗漏了?标记
花几天时间尝试不同的重载来发送文件send()
,sendBody()
,sendBodyAndHeader()
甚至sendBodyAndHeaders()
。
我事先尝试UrlEncoder.encode()
,当然不行。
我甚至从camel-core源调试URISupport.normalizeUri(String uri)
并发现了一些有趣的东西。显然没有多少编码会在发送正文和标题之前对我有任何好处,因为它似乎在做自己的编码而且看起来完全不正确。我认为这是sendBodyAndHeader()
中的错误。它在发送之前将&符号编码回URI。这是不好的。我们为什么这样做?我们有一个应用程序,它从一个部门读取文件并写入共享,另一个系统自动选择这些文件,并在文件处理完成后交付。
请参阅下面的camel URISupport.normalizeUri(String uri)
方法在此处对URI进行编码,这会将&符号放回文件路径中。
URI u = new URI(UnsafeUriCharactersEncoder.encode(uri));
所以你看到URI中的文件路径上的预处理数量根本不会起作用,因为sendBodyAndHeader会做任何感觉。我想在此API中添加一个新的重载来关闭规范化,并按原样发送URI。但是想在这里查看是否有人有任何不那么激烈的选择。请注意,当&符号位于文件方案的URI路径中时,这是一个问题。
ProducerTemplate prod = exchange.getContext().createProducerTemplate();
destPath = destPath.replace(':', '|');
destPath = destPath.replaceAll("\\\\", "/");
destPath = destPath.replaceAll("&", "%26"); // replace the ampersand
String query = "file:///" + destPath;
prod.sendBodyAndHeader(query, exchange.getIn().getBody(), Exchange.FILE_NAME, destFileName);
答案 0 :(得分:0)
使用CamelFileName标头可以避免将端点URI与保留字符&如果你真的需要文件路径中的那个字符。
此示例会将文件放入c:\a&b
public void sendAnyFile(Exchange e){
ProducerTemplate pt = getContext().createProducerTemplate();
pt.sendBodyAndHeader("file:///c:/",e.getIn().getBody(String.class), "CamelFileName", "a&b/hej.txt");
}