使用Apache Commons Net发送到FTP后增加文件大小[重复]

问题描述 投票:0回答:1

我正在尝试使用jcraft使用commons-net直接从sftp发送文件到ftp服务器这是我的代码的一个小例子:

    JSch jsch = new JSch();
    Session session = jsch.getSession("username", "sftp.server.address", 22);
    session.setConfig("StrictHostKeyChecking", "no");
    session.setPassword("password");
    session.connect();

    //connect to sftp
    Channel channel = session.openChannel("sftp");
    channel.connect();
    ChannelSftp sftpChannel = (ChannelSftp) channel;

    //connect to ftp
    FTPClient ftpClient = new FTPClient();
    ftpClient.connect("ftp.server.address", 21);
    ftpClient.login("username", "password");
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); // maybe here is the problem :/

    //getting file as an inputstream from the sftp
    InputStream sftpFileInputStream = sftpChannel.get("/temp/file1");

    //sending sftp fileinputstream directry to the ftp server
    ftpClient.storeFile("file1", sftpFileInputStream);
    ftpClient.disconnect();

    sftpChannel.exit();
    session.disconnect();

这个想法很简单 - 同时连接到两个服务器,从sftp服务器获取文件作为输入流并将其发送到另一个ftp服务器。代码正常工作,但发送后文件大小增加了2MB。最大的问题是该文件没有扩展名,我不知道我发送的是什么。我不确定文件在发送后是否损坏,而且我不确定我应该使用什么样的传输模式来使用Apache commons net这样的文件。

据我所知,InputStream不受文件类型的影响,对吧?理解正在发生的事情的一点帮助将不胜感激......

我将首先尝试将文件保存为临时文件,然后将其发送到ftp服务器。我将更新帖子以获取更多信息。

编辑:将文件从sftp下载到临时文件没有任何更改 - 文件大小不变。但是在使用commons-net发送到ftp服务器之后再次增加了2MB的文件大小。经过一些测试后,我发现问题来自发送文件 - 主题更改为更清晰。

这里有一个更明显的例子:

//connect to ftp
    FTPClient ftpClient = new FTPClient();
    ftpClient.connect("ftp.server.address", 21);
    ftpClient.login("username", "password");

    //sending inputstream to the ftp server
    ftpClient.storeFile("data", new FileInputStream(new File("/data")));
    ftpClient.disconnect();

忘记提到该文件大约500MB,正如我所说它没有扩展名。

更新:使用IOUtils没有问题:

URL url = new URL("ftp://username:[email protected]/data");
URLConnection urlConnection = url.openConnection();

FileInputStream fileInputStream = new FileInputStream(new File("/data"));
OutputStream outputStream = urlConnection.getOutputStream();
IOUtils.copy(fileInputStream, outputStream);
fileInputStream.close();
outputStream.close();

发送后文件大小相同...仍然无法理解FTPClient引擎盖下发生了什么。

java ftp apache-commons-net
1个回答
0
投票

我的错误是我在FTP.BINARY_FILE_TYPE上使用ftpClient.setFileTransferMode ...感谢@Martin Prikryl我在历史上看到过它。而且我也不是alone in this mistake。这是工作示例:

FTPClient ftpClient = new FTPClient();
ftpClient.connect("ftp.server.address", 21);
ftpClient.login("username", "password");
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); 
ftpClient.storeFile("data", new FileInputStream(new File("/data")));
ftpClient.disconnect();

ftpClient.setFileType的价值观是:

  • FTP.ASCII_FILE_TYPE - 如果永远不调用该方法,则为默认值
  • FTP.EBCDIC_FILE_TYPE - 表示正在传输的文件应被视为EBCDIC
  • FTP.BINARY_FILE_TYPE - 表示正在传输的文件应被视为二进制图像,即不应执行任何翻译
  • FTP.LOCAL_FILE_TYPE - 表示正在传输的文件应被视为本地类型

ftpClient.setFileTransferMode的价值观是:

  • FTP.STREAM_TRANSFER_MODE - 从未调用此方法或调用connect方法时的默认传输模式
  • FTP.BLOCK_TRANSFER_MODE - 表示文件将作为一系列块传输
  • FTP.COMPRESSED_TRANSFER_MODE - 表示文件将作为FTP压缩数据传输

来自文档的Here is a link可以节省我几小时的测试时间。

© www.soinside.com 2019 - 2024. All rights reserved.