这个问题在这里已有答案:
我正在尝试使用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引擎盖下发生了什么。
我的错误是我在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
的价值观是:
ftpClient.setFileTransferMode
的价值观是:
来自文档的Here is a link可以节省我几小时的测试时间。