-1

当使用ProducerTemplate.sendBodyAndHeader()“文件”方案将文件发送到其目的地时,并且 URI 中的文件路径包含 & 符号,它无法传递文件并出现以下错误。

org.apache.camel.ResolveEndpointFailedException:无法解析端点:file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2f1dc5531a5a/2596/PB&J%20Generic%2007064782/transcoded/21726 由于:无法解析端点:file:///c%7C/IMM_SAN/Marketing/f77333bd-f96f-4873-b846-2f1dc5531a5a/25964/PB&J%20Generic%2007064782/transcoded/21726 由于:无效的 uri 语法:否?标记但是 uri 有 & 参数分隔符。检查 uri 是否缺少 ? 标记。

花几天时间尝试不同的重载来发送文件send(),甚至。sendBody()sendBodyAndHeader()sendBodyAndHeaders()

我事先尝试过UrlEncoder.encode(),当然不行。

我什至URISupport.normalizeUri(String uri)从骆驼核心源中调试了它,发现了一些有趣的东西。显然,在发送正文和标头之前,再多的编码都不会对我有任何好处,因为它似乎在进行自己的编码,而且似乎完全不正确。我认为这是sendBodyAndHeader(). 它在发送之前将 & 符号编码回 URI。这是不好的。我们为什么要这样做?我们有一个应用程序,它从一个部门读取文件并写入共享,另一个系统自动拾取这些文件并在文件处理完成时交付它。

请参阅下面的骆驼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);
4

1 回答 1

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");
}
于 2012-12-15T09:34:42.293 回答