2016-09-16 26 views
0

我试图从服务器下载一个文件,但它得到0字节......FTPClient下载一个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; 
    } 

基本上,临时呸得到创建,然后前面的文件被取消,临时文件被重命名,但它是0字节...我不明白哪里出了问题...

+0

我不确定,但尝试在'ftpClient.retrieveFile'之后但在'os.close()'之前刷新输出流'os.flush()'。 – Shadov

回答

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; 
} 

}

+0

你确定这是下载文件而不是上传到服务器吗? – besmart

+0

是的,这是我现有的代码。我用于我的目的 –

0

的BufferedOutputStream将数据写入到内部缓冲区,所以你可能需要冲洗 OutputStream的闭幕前:

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

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

另一个秘诀:

  • 总是给Bu提供缓冲区大小(通常是8Kb的倍数)。

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

  • 不要留下catch条款没有适当的处理。 固定为(如果您希望程序从该例外中恢复),例外情况应该是向上传播(默认情况下,传播)。只有日志不太可能是最好的治疗方法。
相关问题