2017-08-10 344 views
0

当通过FTPClient类文件从FTP服务器下载文件带来破坏检查初始文件(IMG1)和下载的文件(IMG2)FTPClient下载文件损坏

来源:

public class FtpClient extends FTPClient { 

private String host; 
private int port; 
private String username; 
private String password; 
private boolean connected; 

public FtpClient(String host, int port, String username, String password) { 
    this.host = host; 
    this.port = port; 
    this.username = username; 
    this.password = password; 

    connected = connect(); 
} 


private void verifyConnection() throws ConnectionException { 
    if(!connected){ 
     ConnectionException ex = new ConnectionException(); 
     log.error(ex.getMessage()); 
     throw ex; 
    } 
} 


private boolean connect(){ 
    try { 
     //try to connect 
     connect(host, port); 

     if(!login(username, password)){ 
      logout(); 
      return false; 
     } 

     int reply = getReplyCode(); 

     if(!FTPReply.isPositiveCompletion(reply)){ 
      disconnect(); 
      return false; 
     } 
     enterRemotePassiveMode(); 
     setFileTransferMode(BINARY_FILE_TYPE); 
     setFileType(BINARY_FILE_TYPE); 

     log.debug("Remote system is " + getSystemType()); 
     log.debug("Current directory is " + printWorkingDirectory()); 

     return true; 
    } catch (IOException e) { 
     log.error(e.getMessage()); 
     e.printStackTrace(); 

     return false; 
    } 
} 

public void get(String batchName, String fileName) throws IOException, ConnectionException { 
    verifyConnection(); 
    File file = new File("/tmp/" + batchName); 

    if (!file.exists()){ 
     boolean mkdir = file.mkdir(); 
     log.info("Create batch directory '{}' result: {}",batchName, mkdir); 
    } 
    OutputStream outputStream = new FileOutputStream("/tmp/" + batchName + "/" + fileName); 
    boolean result = retrieveFile(batchName + "/" + fileName, outputStream); 

    log.debug("Retrieve file {}, result: {}", batchName + "/" + fileName, result); 
    outputStream.close(); 
} 
} 

IMG1 img1

img2 img2

出了什么问题?

+0

有趣!在关闭之前尝试刷新OutputStream。 – LanfeaR

+0

你是否比较了文件(大小上大多数是JPEG格式;))。我猜想有一些数据缺失导致抵消 – AxelH

+0

@AxelH我比较这些文件和大小是一样的。 – GVArt

回答

0

您对FTPClient.setFileTransferMode使用了不正确的常数。

setFileTransferMode(BINARY_FILE_TYPE); 

像医生说:

模式 - 新的传输模式使用(该FTP类_TRANSFER_MODE常量之一)。

您可以使用其中的一个:

  • FTP.BLOCK_TRANSFER_MODE
  • FTP.COMPRESSED_TRANSFER_MODE
  • FTP.STREAM_TRANSFER_MODE

这可能会纠正你传递的问题,因为你正在使用的值可以是任何东西...

您正在传递的值为2,它预计为[10|11|12]之一。所以它可能保持默认的STREAM_TRANSFER_MODE值。