java 中 FtpClient 实现 FTP 文件上传、下载
生活随笔
收集整理的這篇文章主要介紹了
java 中 FtpClient 实现 FTP 文件上传、下载
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
源代碼大部分是網(wǎng)上找的,查來(lái)查去,找到幾個(gè)可以用的例子,改來(lái)改去,揉合成現(xiàn)在這個(gè)樣子。
一、 jar包準(zhǔn)備(web service 的jar ?不需要)
?
二、配置文件:
?
配置文件內(nèi)容:
?
ftpUserName=hn_name ftpPassword=hn_pwd ftpHost=10.3.4.222 ftpPort=21 ftpPath=/home/hn_dhmp writeTempFielPath=D\:\\ftpDownLoad?
?
?
?
?
?
三、 ftp 工具類:
?
?
<strong>package ftp;import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException;import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.apache.log4j.Logger;/*** ftp 上傳、下載工具類* @author JiangYu*/ public class FtpUtil { private static Logger logger = Logger.getLogger(FtpUtil.class); /** * 獲取FTPClient對(duì)象 * @param ftpHost FTP主機(jī)服務(wù)器 * @param ftpPassword FTP 登錄密碼 * @param ftpUserName FTP登錄用戶名 * @param ftpPort FTP端口 默認(rèn)為21 * @return */ public static FTPClient getFTPClient(String ftpHost, String ftpPassword, String ftpUserName, int ftpPort) { FTPClient ftpClient = null; try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost, ftpPort);// 連接FTP服務(wù)器 ftpClient.login(ftpUserName, ftpPassword);// 登陸FTP服務(wù)器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.info("未連接到FTP,用戶名或密碼錯(cuò)誤 !"); ftpClient.disconnect(); } else { logger.info("FTP連接成功。"); } } catch (SocketException e) { e.printStackTrace(); logger.info("請(qǐng)檢查FTP的IP地址 ! "); } catch (IOException e) { e.printStackTrace(); logger.info("請(qǐng)核對(duì)FTP的端口 ! "); } return ftpClient; } /*** 上傳本地文件到FTP服務(wù)器 * @param ftpPath 服務(wù)器上存放文件的路徑* @param ftpUserName ftp服務(wù)賬號(hào)* @param ftpPassword ftp服務(wù)密碼* @param ftpHost ftp服務(wù)ip* @param ftpPort ftp服務(wù)端口* @param fileContent 文件內(nèi)容* @param writeTempFielPath 文件在本地的路徑*/public static String upload(String ftpPath, String ftpUserName, String ftpPassword, String ftpHost, int ftpPort, String fileContent, String writeTempFielPath) { FTPClient ftpClient = null; String uploadResult = "";try { ftpClient = getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort); // 設(shè)置PassiveMode傳輸 ftpClient.enterLocalPassiveMode(); // 設(shè)置以二進(jìn)制流的方式傳輸 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 對(duì)遠(yuǎn)程目錄的處理 String remoteFileName = ftpPath; if (ftpPath.contains("/")) { remoteFileName = ftpPath .substring(ftpPath.lastIndexOf("/") + 1); } // 先把文件寫出到本地,再上傳到FTP上,最后再刪除 。String result = write(remoteFileName, fileContent, writeTempFielPath); if (result.contains("成功")) { File f = new File(writeTempFielPath + "/" + remoteFileName); InputStream in = new FileInputStream(f); ftpClient.storeFile(remoteFileName, in); in.close(); uploadResult = "文件" + remoteFileName + "上傳成功!";f.delete(); // 刪除本地臨時(shí)文件} else { uploadResult = "文件" + remoteFileName + "上傳失敗!";} return uploadResult;} catch (Exception e) { e.printStackTrace(); return uploadResult+"錯(cuò)誤源: "+e.getMessage();}finally{ try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } /*** 文件寫出到本地* @param fileName 文件名* @param fileContext 文件內(nèi)容* @param writeTempFielPath 本地存儲(chǔ)路徑* @return*/public static String write(String fileName, String fileContext, String writeTempFielPath) { String result = "寫出成功 !";try { File f = new File(writeTempFielPath + "/" + fileName); if(!f.exists()){ if(!f.createNewFile()){ result = "文件不存在,創(chuàng)建失敗 !";} } BufferedWriter bw = new BufferedWriter(new FileWriter(f, true)); bw.write(fileContext.replaceAll("\n", "\r\n")); bw.flush(); bw.close(); return result; } catch (Exception e) { result = "寫出失敗 !";e.printStackTrace(); return result; } } /** * 從FTP服務(wù)器下載文件 * @param ftpHost FTP服務(wù)器IP * @param port FTP服務(wù)器端口 * @param username FTP登錄賬號(hào) * @param password FTP登錄密碼 * @param remotePath FTP服務(wù)器上的相對(duì)路徑 * @param fileName 要下載的文件名 * @param localPath 下載后保存到本地的路徑 * @return */public static String downFile(String ftpHost, int port,String username, String password,String remotePath,String fileName,String localPath) { String result = "下載失敗 !"; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(ftpHost, port); ftp.login(username, password); // 登錄 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return "服務(wù)連接失敗 !"; } ftp.changeWorkingDirectory(remotePath); // 轉(zhuǎn)移到FTP服務(wù)器目錄 FTPFile[] fs = ftp.listFiles(); boolean flag = false; // 下載文件不存在for(FTPFile ff:fs){ if(ff.getName().equals(fileName)){ File localFile = new File(localPath+"/"+ff.getName()); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); is.close(); flag = true;} }ftp.logout(); if(!flag){result = "文件: "+fileName+"不存在 !"; }else{result = "下載成功 !"; }} catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) {} } } return result; }} </strong>?
?
?
upload方法可以用這個(gè)方法代替,直接上傳整個(gè)文件,而不作用把文件內(nèi)容作為參數(shù),此方法主體代碼來(lái)自網(wǎng)絡(luò):
?
package ftp;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties;import org.apache.commons.net.ftp.FTPClient; /*** 文件上傳替換方法 **/ public class FtpUpToo {private static FTPClient ftpClient = null; /** * ftp上傳文件* @param targetFname 生成目標(biāo)文件 * @return true||false */ public static boolean uploadFile(String targetFname){ int ftpPort = 0; String ftpUserName = ""; // ftp服務(wù)賬號(hào)String ftpPassword = ""; // ftp服務(wù)密碼String ftpHost = ""; // ftp服務(wù)ipString ftpPath = ""; // ftp服務(wù)器上存放文件的路徑String writeTempFielPath = ""; // 文件在本地的路徑String proName = "ftp.properties"; // 配置文件名try {// 配置文件一定要和本類放在同一包下才能找到 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName); if (in == null) { throw new Exception("配置文件"+proName+"讀取失敗 !");} Properties properties = new Properties(); properties.load(in); ftpUserName = properties.getProperty("ftpUserName"); ftpPassword = properties.getProperty("ftpPassword"); ftpHost = properties.getProperty("ftpHost"); ftpPort = Integer.valueOf(properties.getProperty("ftpPort")) .intValue(); ftpPath = properties.getProperty("ftpPath"); writeTempFielPath = properties.getProperty("writeTempFielPath"); } catch (Exception e) {e.printStackTrace();} boolean flag = false; ftpClient = FtpUtil.getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort); if( ftpClient!=null ){ File srcFile = new File(writeTempFielPath+"/JiangYuUp.csv"); FileInputStream fis = null; try { fis = new FileInputStream(srcFile); //設(shè)置上傳目錄 ftpClient.changeWorkingDirectory(ftpPath); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("GBK"); //設(shè)置文件類型(二進(jìn)制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //上傳 flag = ftpClient.storeFile(targetFname, fis); } catch (Exception e) { e.printStackTrace(); closeCon(); }finally{ try {fis.close();System.out.println("運(yùn)行結(jié)束!----");} catch (IOException e) {e.printStackTrace();}} } return flag; }/** * 銷毀ftp連接*/ public static void closeCon(){ if(ftpClient !=null){ if(ftpClient.isConnected()){ try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } }?
?
?
?
?
四、測(cè)試類:
?
?
<strong>package ftp;import java.io.InputStream; import java.util.Properties;public class FtpTest { public static void main(String[] args) { new FtpTest().test();} private void test(){int ftpPort = 0; String ftpUserName = ""; // ftp服務(wù)賬號(hào)String ftpPassword = ""; // ftp服務(wù)密碼String ftpHost = ""; // ftp服務(wù)ipString ftpPath = ""; // ftp服務(wù)器上存放文件的路徑String writeTempFielPath = ""; // 文件在本地的路徑String proName = "ftp.properties"; // 配置文件名try { // 配置文件一定要和本類放在同一包下才能找到 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName); if (in == null) { throw new Exception("配置文件"+proName+"讀取失敗 !");} Properties properties = new Properties(); properties.load(in); ftpUserName = properties.getProperty("ftpUserName"); ftpPassword = properties.getProperty("ftpPassword"); ftpHost = properties.getProperty("ftpHost"); ftpPort = Integer.valueOf(properties.getProperty("ftpPort")) .intValue(); ftpPath = properties.getProperty("ftpPath"); writeTempFielPath = properties.getProperty("writeTempFielPath"); // 下載String result = FtpUtil.downFile(ftpHost, ftpPort, ftpUserName, ftpPassword,ftpPath, "JiangYu.csv", writeTempFielPath); // JiangYu.csv:下載文件的名稱System.out.println("文件下載結(jié)果為:" + result); // 上傳ftpPath = ftpPath + "/" + "JiangYu.csv"; // JiangYu.csv:上傳文件的名稱FtpUtil.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, "這里是文件內(nèi)容", writeTempFielPath); } catch (Exception e) { e.printStackTrace(); } } } </strong>?
?
注: ?測(cè)試類運(yùn)行后下載成功的文件 和 上傳時(shí)的臨時(shí)文件是一樣的名字,會(huì)被上傳成功后刪除臨時(shí)文件操作所刪除。
?建議上傳和下載分開(kāi)測(cè)試。
?
五、 上傳、下載結(jié)果:
?
?
總結(jié)
以上是生活随笔為你收集整理的java 中 FtpClient 实现 FTP 文件上传、下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 巧用css实现强制不换行、自动换行、强制
- 下一篇: 孩子带引父母