如何将字节或流写入Apache Camel FTP以传输文件

时间:2018-11-30 07:17:43

标签: java stream byte filestream camel-ftp

目前,在我的代码中,我从数据库中获取数据,然后从数据中写入文件。我有这种骆驼路线和可行的解决方案:-

private static final String INPUT_FILE_DIRECTORY_URI = "file:" + System.getProperty("user.home")
        + "/data/cdr/?noop=false";

private static final String SFTP_SERVER = "sftp://" +System.getProperty("user.name")
        + "@sftp_server_url/data/cdr/?privateKeyFile=~/.ssh/id_rsa&passiveMode=true";

from(INPUT_FILE_DIRECTORY_URI)
            .streamCaching()
            .log("Sending file to local sftp")
            .to(SFTP_SERVER); 

我不想在本地磁盘中写入文件。相反,我想直接将文件数据写入SFTP服务器。我不知道该怎么做?但是我想应该有可能做到这一点。你能告诉我有可能吗?如果是,该怎么办?

3 个答案:

答案 0 :(得分:0)

除非真正使用streamCaching,否则不应该使用它。它将文件存储在内存中,如果您需要消耗输入内容的倍数,请使用它。

您可以使用Jpa component或自定义bean来获取数据。从数据库加载它,然后将其发送到您的ftp服务器。

使用Jpa:

@Entity 
@NamedQuery(name = "data", query = "select x from Data x where x.id = 1") 
public class Data { ... }

之后,您可以定义一个消费者uri:

from("jpa://org.examples.Data?consumer.namedQuery=data")
.to("SFTP_SERVER");

编辑:将列表转换为csv并将其发送到ftp:

from("jpa://org.examples.Data?consumer.namedQuery=data")
.marshal()
.csv()
.to("sftp://" +System.getProperty("user.name") + 
"@sftp_server_url/data/cdr/myFile.csv?" +"privateKeyFile=~/.ssh/id_rsa&passiveMode=true");

请参见CSV component,他们将列表转换为csv文件。

答案 1 :(得分:0)

我设法用另一种方式解决了这个问题。它更适合我的特定问题。

             byte[] csvData = csvStringBuilder.toString().getBytes();
             Routes.withProducer(producer)
                    .withHeader(Exchange.FILE_NAME, myCsvFile.csv)
                    .withBody(csvData)
                    .to(SFTP_SERVER).request(byte[].class);

答案 2 :(得分:0)

是的,有可能:)为此,将文件inputStream发送到骆驼DIRECT组件中,并在关联的路由中将副本复制到FTP。我使用这种情况,上传文件,然后使用from(directInputStreamName).to(yourFtpUri)将其直接复制到ftp。这是一个示例代码:

您的服务

@Service
public class FileService {
  @Produce(uri = PfnumDownloadConstants.CAMEL_DIRECT_UPLOAD)
  private ProducerTemplate producer;

  public void sendFileToFtp(File fileToSend, String ftpDestinationUri) throws IOException {
    Map<String, Object> headers = new HashMap<>();
    //In this variable you can init the ftp destination uri or you can hard code it in route
    headers.put("destinationUri", ftpDestinationUri);
    //set filename to name your file in ftp
    headers.put(Exchange.FILE_NAME_ONLY, file.getName());
    InputStream targetStream = new FileInputStream(file);
    //send stream as body and list of headers to direct 
    producer.sendBodyAndHeaders(targetStream, headers);
  }
}

您的骆驼路线

@Component
public class FileUploadRoute extends RouteBuilder {
  @Override
  public void configure() throws Exception {
    //Manage camel exception in a dedicated processor
    onException(Exception.class).process(exceptionProcessor).log("error :: ${exception}");
  
    from(CAMEL_DIRECT_UPLOAD)
    .log("file copy to ftp '${header.CamelFileNameOnly}' in  process")
    .toD("file:/mnt?fileName=${header.CamelFileNameOnly}&delete=false")
    .log("copy done");
  }
}