使用apache commons-net FTPClient传输原始二进制文件?

时间:2010-06-30 00:41:26

标签: java ftp binary-data apache-commons-net

3 个答案:

答案 0 :(得分:32)

登录ftp服务器后

ftp.setFileType(FTP.BINARY_FILE_TYPE);

以下一行无法解决问题:

//ftp.setFileTransferMode(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);

答案 1 :(得分:4)

听起来好像你的应用程序代码可能已经选择了ASCII和BINARY模式。 ASCII没有变化,BINARY执行行尾字符翻译与FTP应该如何工作完全相反。

如果不是问题,请编辑您的问题以添加代码的相关部分。

修改

其他几种可能(但IMO不太可能)的解释:

  • FTP服务器损坏/配置错误。 (您是否可以使用非Java命令行FTP实用程序以ASCII / BINARY模式成功下载文件?)
  • 您正在通过破坏或配置错误的代理与FTP服务器通信。
  • 你以某种方式设法获得Apache FTP客户端JAR文件的狡猾(被黑)副本。 (是的,是的,非常不可能......)

答案 2 :(得分:3)

我发现Apache retrieveFile(...)有时无法使用超过特定限制的文件大小。为了克服这个问题,我会使用retrieveFileStream()代替。在下载之前,我已经设置了Correct FileType并将Mode设置为PassiveMode

所以代码看起来像

    ....
    ftpClientConnection.setFileType(FTP.BINARY_FILE_TYPE);
    ftpClientConnection.enterLocalPassiveMode();
    ftpClientConnection.setAutodetectUTF8(true);

    //Create an InputStream to the File Data and use FileOutputStream to write it
    InputStream inputStream = ftpClientConnection.retrieveFileStream(ftpFile.getName());
    FileOutputStream fileOutputStream = new FileOutputStream(directoryName + "/" + ftpFile.getName());
    //Using org.apache.commons.io.IOUtils
    IOUtils.copy(inputStream, fileOutputStream);
    fileOutputStream.flush();
    IOUtils.closeQuietly(fileOutputStream);
    IOUtils.closeQuietly(inputStream);
    boolean commandOK = ftpClientConnection.completePendingCommand();
    ....