FTPClient下载一个0字节的文件

时间:2016-09-16 20:46:24

标签: java

我试图从服务器下载文件,但它得到0字节......

这是我的FTPDownload类

public boolean getFile(String filename){

        try {
        FTPClient ftpClient = new FTPClient();

            ftpClient.connect(ftpAddress, ftpPort);
            ftpClient.login(ftpUser, ftpPass);
            int reply = ftpClient.getReplyCode();
            //FTPReply stores a set of constants for FTP reply codes. 
            if (!FTPReply.isPositiveCompletion(reply))
            {
                ftpClient.disconnect();
                return false;

            }
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.setBufferSize(1024*1024);

            String remoteFile = serverPath + filename;
            logger.debug("remote file is: "+remoteFile); //correct path
            File tempFile = new File(downloadDir+"temp.jar");
            logger.debug("file will be "+tempFile.toString()); //correctly created
            OutputStream os = new BufferedOutputStream(new FileOutputStream(tempFile));

            ftpClient.retrieveFile(remoteFile, os);
            os.close();

            String completeJarName = downloadDir+jarName;
            //delete previous file
            File oldFile = new File(completeJarName);
            FileUtils.forceDelete(oldFile);


            //rename
            File newFile = new File(completeJarName);
            FileUtils.moveFile(tempFile, newFile);

             if (ftpClient.isConnected()) {
                 ftpClient.logout();
                 ftpClient.disconnect();

             }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error("errore ftp", e);
            return false;
        } 

        return true;
    }

基本上,临时fie被创建,然后前一个文件被取消并且临时文件被重命名,但是它是0字节......我无法理解出错的地方......

2 个答案:

答案 0 :(得分:0)

我使用apache.common进行FTP下载。这是代码,你可以尝试

 public class FTPUtils {
 private String hostName = "";
 private String username = "";
 private String password = "";
 private StandardFileSystemManager manager = null;
 FileSystemOptions opts = null;

 public FTPUtils(String hostName, String username, String password) {
  this.hostName = hostName;
  this.username = username;
  this.password = password;
  manager = new StandardFileSystemManager();
 }
     private void initFTPConnection() throws FileSystemException {
  // Create SFTP options
  opts = new FileSystemOptions();
  // SSH Key checking
  SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
    opts, "no");
  // Root directory set to user home
  SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false);
  // Timeout is count by Milliseconds
  SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);
 }

 public void onUpload(String ftpfolder, String localFilePath, String fileName) {
  File file = new File(localFilePath);
  if (!file.exists())
   throw new RuntimeException("Error. Local file not found");

  try {
   manager.init();
   // Create local file object
   FileObject localFile = manager.resolveFile(file.getAbsolutePath());

   String remoteFilePath = "/" + ftpfolder + "/" + fileName;
   // Create remote file object
   FileObject remoteFile = manager.resolveFile(
     createConnectionString(hostName, username, password,
       remoteFilePath), opts);
   // Copy local file to sftp server
   remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);
   System.out.println("Done");
  } catch (Exception e) {
   // Catch and Show the exception
  } finally {
   manager.close();

  }
 }
public static String createConnectionString(String hostName,
   String username, String password, String remoteFilePath) {
  return "sftp://" + username + ":" + password + "@" + hostName + "/"
    + remoteFilePath;
 }

}

答案 1 :(得分:0)

BufferedOutputStream将数据写入内部缓冲区,因此您可能需要在关闭之前刷新 outputStream:

OutputStream os = new BufferedOutputStream(new FileOutputStream(tempFile));

ftpClient.retrieveFile(remoteFile, os);
os.flush();
os.close();

另一个提示:

  • 始终为缓冲流提供缓冲区大小(通常为8Kb的倍数)。

  • 在实例化流时始终使用try-with-resources指令,并让它们自动关闭。

  • 未经适当处理,请勿留下catch条款。应该修复(如果您希望程序从该异常中恢复)传播向上(默认情况下,传播)。只有一个日志不太可能是最好的治疗方法。