如何消除Mule 3.9 SFTP获取的CSV文件开头隐藏特殊字符?
问题描述
使用Mule 3.9通过请求器连接SFTP获取CSV文件时,文件开头出现一个隐藏特殊字符(?)。已尝试使用UTF-8编码的byte-array-to-string和byte-array-to-object转换器,但问题未解决。
使用的代码片段
<poll doc:name="Poll"> <fixed-frequency-scheduler frequency="1000" startDelay="10" timeUnit="MINUTES"/> <logger message="### SFTP Localization Started ###" level="INFO" doc:name="Logger"/> </poll> <mulerequester:request resource="sftp://${ftploc.user}:${ftploc.password}@${ftp.host}:22/${ftpcampaignmapping.path}" doc:name="Mule Requester" timeout="10000"/> <object-to-string-transformer encoding="UTF-8" doc:name="Object to String" ignoreBadInput="true"/> <logger message="#[payload]" level="INFO" doc:name="Logger"/>
问题截图

解决方案
这个特殊字符大概率是UTF-8 BOM(字节顺序标记),以下是几种可行的解决方式:
- 方法1:用Groovy脚本去除BOM
在object-to-string-transformer之后添加Groovy组件,手动剔除开头的BOM字符:
def payloadStr = payload as String if (payloadStr.startsWith('\uFEFF')) { payload = payloadStr.substring(1) } return payload
- 方法2:自定义Java处理器处理
编写一个简单的Java处理器,通过流读取时跳过BOM:
<component doc:name="Remove BOM"> <spring-object> <bean class="com.example.RemoveBomProcessor"/> </spring-object> </component>
对应的Java代码示例:
import org.mule.api.MuleEventContext; import org.mule.api.lifecycle.Callable; import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class RemoveBomProcessor implements Callable { @Override public Object onCall(MuleEventContext eventContext) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader( eventContext.getMessage().getPayloadAsStream(), StandardCharsets.UTF_8)); // 检查并跳过BOM reader.mark(1); if (reader.read() != '\uFEFF') { reader.reset(); } StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } return sb.toString().trim(); } }
- 方法3:源端文件格式修正
如果有权限修改SFTP上的文件,用文本编辑器(如Notepad++)打开文件,选择「编码 -> UTF-8无BOM」格式重新保存,从根源消除BOM。
内容的提问来源于stack exchange,提问作者Niharika Tangella
相关产品推荐
相关产品推荐

