經驗證,在FTP服務端設定為被動模式,且用戶端和服務端不在同一個網段的情況下,sun.net.ftp.FtpClient會出現上傳檔案失敗(進程僵死,服務端已接收的檔案大小為0)的情況,此為該類的一個BUG,建議使用java ftp時不要使用sun.net.ftp.FtpClient,而用APACHE基金會的commons-net.jar中的org.apache.commons.net.ftp.FTPClient來實現。
1.Jsp頁面中:
<form method="post"enctype="multipart/form-data">
<input name=”file” type=”file”></form>
註:這裡的form必須為post提交,並且有enctype屬性(如果form中有其他類型input,並不影響Action中對其他input的值的接收)
2.Action中:
對應的file類型的input的name屬性為:file
則應有3個屬性接收:
File file;
String fileName;
String fileContentType;
其中 file為接收到的頁面傳來的檔案(暫時存到tomcat的臨時檔案夾中,一般為tomcat根資料夾\work\當前項目\ 中)。fileName為該檔案名稱,fileContentType為該檔案類型(如:圖片類型:image/jpeg)。
3.使用FTPClient串連FTP伺服器org.apache.commons.net.ftp.FTPClient
FTPClient client = new FTPClient();
client.connect(FTP伺服器IP地址); --串連FTP伺服器
FTPReply.isPositiveCompletion(client.getReplyCode()); --判斷是否串連成功
client.login(userName,password); --串連成功後使用使用者名稱密碼登陸(boolean傳回值,可判斷是否登陸成功)
client.setFileType(FTPClient.BINARY_FILE_TYPE); --設定FTP互動時使用的檔案類型
4.FTPClient上傳
client.changeWorkingDirectory(remotePath); --設定FTP上傳對應的路徑(boolean傳回值,當存在路徑時返回true)
client.makeDirectory(remotePath); --在FTP伺服器中建立路徑(boolean傳回值)
FileInputStreamin = new FileInputStream(file);
client.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1"), in);
--設定上傳到FTP中的檔案名稱(注意編碼格式,FTP中一般使用iso-8859-1),上傳
5.FTPClient關閉
client.isConnected(); --FTP伺服器是否在串連
client.disconnect(); --FTP串連關閉
這裡注意在將client設定為靜態變數時,關閉後將client置空,否則次串連時會出現異常