2011-09-09 164 views
1

我很難找出一些東西。 (我對這一切都很陌生。) 我寫了這個java pgm來將一個大文件傳輸到目標服務器。 下面的代碼(代碼被修改了一下顯示):FTP客戶端問題

public static void ftpUpload(String path, String upfileName, String dirName) throws Exception 
{ 
    FTPClient client = new FTPClient(); 
    client.addProtocolCommandListener((ProtocolCommandListener) new PrintCommandListener(new PrintWriter(System.out))); 
    client.enterLocalPassiveMode(); 

    FileInputStream fis = null; 

    int reply; 

    try { 
     client.connect(ftpserver); 
     client.login(ftpuserid, ftppasswd); 
     reply = client.getReplyCode(); 

     if(FTPReply.isPositiveCompletion(reply)){ 
      client.changeWorkingDirectory(ftpdirectoryName + "/" + dirName); 

      boolean mkDir = client.makeDirectory(getCurrentMMMYY().toLowerCase()); 

      client.changeWorkingDirectory(getCurrentMMMYY().toLowerCase()); 

       //Create an InputStream of the file to be uploaded 
      fis = new FileInputStream(path + upfileName); 

      //Store file to server 
      client.storeFile(upfileName, fis); 

     }  
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fis != null) { 
       fis.close(); 
      } 
      client.logout(); 
      //client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

奇怪的事情正在發生的事情對我送的文件... 我的一個始發服務器上的文件是82575786的大小,當我ftp這個文件它幾乎發送整個文件。它實際上發送82574867.(缺少919) 始發服務器上的另一個文件是717885,當我ftp這個文件時,它幾乎發送整個文件。它實際上發送717522.(錯過363)

我拉了日誌,看看是否有東西墜毀,但它沒有顯示任何錯誤的轉移。以下是顯示傳輸的2個日誌條目。

[08/09/11 20:21:13:618 EDT] 00000043 SystemOut O 221 - 您已在1個文件中傳輸了717522個字節。 221 - 您已經在1個文件中傳輸了82574867個字節。

任何人的幫助將不勝感激。感謝 丹。

+0

我可能會問你爲什麼要使用輸入與outpustream ,所以發送文件只有一個輸入流,它不工作?謝謝! – 98percentmonkey

回答

3

您是以ASCII模式而不是二進制傳輸嗎? ASCII模式將CR/LF轉換爲LF,反之亦然,具體取決於服務器和客戶端設置。

您使用的是Apache's FTP客戶端嗎?它說默認爲ASCII,你可以嘗試設置與BINARY_FILE_TYPEsetFileType

client.setFileType(FTPClient.BINARY_FILE_TYPE); 
+0

感謝Jason,文件通過添加二進制文件類型進一步提前,但它仍然沒有ftp整個文件。這兩個文件仍然沒有得到最後幾個記錄。 –

1

要上傳您必須使用FTP.BINARY_FILE_TYPE但不夠二進制文件。

只使用一個輸入流,你需要使用太多

我希望這個例子可以幫助您的OutputStream:

FTPClient client = new FTPClient(); 
client.connect("192.168.30.20"); 
client.login("pwd", "pwd"); 

client.setFileType(FTP.BINARY_FILE_TYPE); 
String path_base = "/myPath/"; 
InputStream fis = new FileInputStream("A.pdf"); 
OutputStream os = client.storeFileStream(path_base+ "B.pdf"); 


byte buf[] = new byte[8192]; 
int bytesRead = fis.read(buf); 
while (bytesRead != -1) { 
    os.write(buf, 0, bytesRead); 
    bytesRead = fis.read(buf);} 

fis.close(); 
os.close(); 
client.completePendingCommand(); 
client.logout(); 
client.disconnect();