Windows 下利用FTP實現用戶端與伺服器檔案傳輸

來源:互聯網
上載者:User

最近由於項目需要,得時間研究下FTP,現將代碼分享下。

 

public class FtpUtils {</p><p> /**<br /> * 向FTP伺服器上傳檔案<br /> *<br /> * @param ip<br /> * FTP伺服器ip e.g:192.168.8.22<br /> * @param port<br /> * FTP伺服器連接埠<br /> * @param username<br /> * FTP登入帳號<br /> * @param password<br /> * FTP登入密碼<br /> * @param serverpath<br /> * FTP伺服器儲存目錄(相對路徑) 預設預設時指向主目錄<br /> * @param file<br /> * 上傳到FTP伺服器上的檔案的絕對路徑 e.g: E:/log/log.txt OR E:/log/log.txt<br /> *<br /> * @return<br /> * 成功返回true,否則返回false<br /> */<br /> public boolean uploadFile(String ip, int port, String username,<br /> String password, String serverpath, String file) {<br /> // 初始表示上傳失敗<br /> boolean success = false;<br /> // 建立FTPClient對象<br /> FTPClient ftp = new FTPClient();<br /> ftp.setControlEncoding("UTF-8");<br /> try {<br /> int reply=0;<br /> // 串連FTP伺服器<br /> // 如果採用預設連接埠,可以使用ftp.connect(ip)的方式直接連接FTP伺服器<br /> ftp.connect(ip, port);<br /> // 登入ftp<br /> ftp.login(username, password);<br /> // 看返回的值是不是reply>=200&&reply<300 如果是,表示登陸成功<br /> reply = ftp.getReplyCode();<br /> // 以2開頭的傳回值就會為真<br /> if (!FTPReply.isPositiveCompletion(reply)) {<br /> ftp.disconnect();<br /> return success;<br /> }<br /> // 轉到指定上傳目錄<br /> serverpath=gbkToIso8859(serverpath);<br /> ftp.changeWorkingDirectory(iso8859ToGbk(serverpath));</p><p> checkPathExist(ftp,iso8859ToGbk(serverpath));</p><p> //輸入資料流<br /> InputStream input=null;<br /> try {<br /> file=gbkToIso8859(file);<br /> input = new FileInputStream(iso8859ToGbk(file));<br /> } catch (FileNotFoundException e) {<br /> e.printStackTrace();<br /> }<br /> // 將上傳檔案儲存體到指定目錄<br /> file=iso8859ToGbk(file);<br /> flag=ftp.storeFile(iso8859ToGbk(serverpath)+"/"+iso8859ToGbk(getFilename(file)), input);<br /> // 關閉輸入資料流<br /> input.close();<br /> // 退出ftp<br /> ftp.logout();<br /> } catch (IOException e) {<br /> e.printStackTrace();<br /> } finally {<br /> if (ftp.isConnected()) {<br /> try {<br /> ftp.disconnect();<br /> } catch (IOException ioe) {<br /> }<br /> }<br /> }<br /> return success;<br /> }</p><p> /**<br /> * 從FTP伺服器下載檔案<br /> *<br /> * @param ip<br /> * FTP伺服器ip e.g:192.168.8.22<br /> * @param port<br /> * FTP伺服器連接埠<br /> * @param username<br /> * FTP登入帳號<br /> * @param password<br /> * FTP登入密碼<br /> * @param serverpath<br /> * FTP伺服器上的相對路徑 預設預設時指向主目錄<br /> * @param fileName<br /> * 要下載的檔案名稱<br /> * @param localPath<br /> * 下載後儲存到本地的路徑 不含檔案名稱<br /> * @return<br /> * 成功返回true,否則返回false<br /> */<br /> public boolean downFile(String ip, int port, String username,<br /> String password, String serverpath, String fileName,<br /> String localPath) {<br /> // 初始表示下載失敗<br /> boolean success = false;<br /> // 建立FTPClient對象<br /> FTPClient ftp = new FTPClient();<br /> ftp.setControlEncoding("UTF-8");<br /> try {<br /> int reply;<br /> // 串連FTP伺服器<br /> // 如果採用預設連接埠,可以使用ftp.connect(ip)的方式直接連接FTP伺服器<br /> ftp.connect(ip, port);<br /> // 登入ftp<br /> ftp.login(username, password);<br /> reply = ftp.getReplyCode();<br /> if (!FTPReply.isPositiveCompletion(reply)) {<br /> ftp.disconnect();<br /> return success;<br /> }<br /> // 轉到指定下載目錄<br /> serverpath=gbkToIso8859(serverpath);<br /> ftp.changeWorkingDirectory(this.iso8859ToGbk(serverpath));<br /> // 列出該目錄下所有檔案<br /> FTPFile[] fs = ftp.listFiles();<br /> fileName=this.gbkToIso8859(fileName);<br /> localPath=this.gbkToIso8859(localPath);</p><p> // 遍曆所有檔案,找到指定的檔案<br /> for (FTPFile f : fs) {<br /> if (f.getName().equals(iso8859ToGbk(fileName))) {<br /> // 根據絕對路徑初始設定檔案<br /> File localFile = new File(iso8859ToGbk(localPath) + "/" + f.getName());<br /> File localFileDir = new File(iso8859ToGbk(localPath));<br /> //儲存路徑不存在時建立<br /> if(!localFileDir.exists()){<br /> localFileDir.mkdirs();<br /> }<br /> // 輸出資料流<br /> OutputStream is = new FileOutputStream(localFile);<br /> // 下載檔案<br /> flag=ftp.retrieveFile(f.getName(), is);<br /> is.close();<br /> }<br /> }<br /> // 退出ftp<br /> ftp.logout();<br /> } catch (IOException e) {<br /> e.printStackTrace();<br /> } finally {<br /> if (ftp.isConnected()) {<br /> try {<br /> ftp.disconnect();<br /> } catch (IOException ioe) {<br /> }<br /> }<br /> }<br /> return success;<br /> }</p><p> /**<br /> *<br /> * 尋找指定目錄是否存在 不存在建立目錄<br /> *<br /> * @param FTPClient<br /> * ftpClient 要檢查的FTP伺服器<br /> * @param String<br /> * filePath 要尋找的目錄<br /> * @return<br /> * boolean:存在:true,不存在:false<br /> * @throws IOException<br /> */<br /> private boolean checkPathExist(FTPClient ftpClient, String filePath)<br /> throws IOException {<br /> boolean existFlag = false;<br /> try {<br /> if (filePath != null && !filePath.equals("")) {<br /> if (filePath.indexOf("/") != -1) {<br /> int index = 0;<br /> while ((index = filePath.indexOf("/")) != -1) {<br /> if (!ftpClient.changeWorkingDirectory(filePath.substring(0,index))) {<br /> ftpClient.makeDirectory(filePath.substring(0,index));<br /> }<br /> ftpClient.changeWorkingDirectory(filePath.substring(0,index));<br /> filePath = filePath.substring(index + 1, filePath.length());<br /> }<br /> if (!filePath.equals("")) {<br /> if (!ftpClient.changeWorkingDirectory(filePath)) {<br /> ftpClient.makeDirectory(filePath);<br /> }<br /> }<br /> }<br /> existFlag = true;<br /> }<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> return existFlag;<br /> }</p><p> /**<br /> * 根據絕對路徑獲得檔案名稱<br /> * @param file<br /> * 檔案絕對路徑 e.g: e.g: E:/log/log.txt OR E://log//log.txt<br /> * @return<br /> * 轉碼後的檔案名稱<br /> */<br /> private String getFilename(String file){<br /> //檔案名稱<br /> String filename="";<br /> if(file!=null&&!file.equals("")){<br /> file=file.replaceAll(Matcher.quoteReplacement("//"), "/");<br /> String[] strs=file.split("/");<br /> filename=strs[strs.length-1];<br /> }<br /> filename=gbkToIso8859(filename);//轉碼<br /> return filename;<br /> }</p><p> /**<br /> * 轉碼[ISO-8859-1 -> GBK]<br /> * 不同的平台需要不同的轉碼<br /> * @param obj<br /> * @return<br /> */<br /> private String iso8859ToGbk(Object obj) {<br /> try {<br /> if (obj == null)<br /> return "";<br /> else<br /> return new String(obj.toString().getBytes("iso-8859-1"), "GBK");<br /> } catch (Exception e) {<br /> return "";<br /> }<br /> }</p><p> /**<br /> * 轉碼[GBK -> ISO-8859-1]<br /> * 不同的平台需要不同的轉碼<br /> * @param obj<br /> * @return<br /> */<br /> private String gbkToIso8859(Object obj) {<br /> try {<br /> if (obj == null)<br /> return "";<br /> else<br /> return new String(obj.toString().getBytes("GBK"), "iso-8859-1");<br /> } catch (Exception e) {<br /> return "";<br /> }<br /> }</p><p>    

代碼說明:

向FTP伺服器上傳檔案時調用uploadFile()方法,從FTP伺服器下載檔案時調用downFile()方法。

 

當然,想向FTP伺服器上傳檔案,FTP伺服器需要開寫入許可權。

 

需要用的jar是commons-net-2.0.jar。

commons-net-2.0.jar API地址:http://commons.apache.org/net/api/index.html

 

希望對朋友們有協助!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.