前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
源代碼大部分是網上找的,查來查去,找到幾個可以用的例子,改來改去,揉合成現在這個樣子。
一、 jar包準備(web service 的jar ?不需要)
?
二、配置文件:
?
配置文件內容:
?
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對象 * @param ftpHost FTP主機服務器 * @param ftpPassword FTP 登錄密碼 * @param ftpUserName FTP登錄用戶名 * @param ftpPort FTP端口 默認為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服務器 ftpClient.login(ftpUserName, ftpPassword);// 登陸FTP服務器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.info("未連接到FTP,用戶名或密碼錯誤 !"); ftpClient.disconnect(); } else { logger.info("FTP連接成功。"); } } catch (SocketException e) { e.printStackTrace(); logger.info("請檢查FTP的IP地址 ! "); } catch (IOException e) { e.printStackTrace(); logger.info("請核對FTP的端口 ! "); } return ftpClient; } /*** 上傳本地文件到FTP服務器 * @param ftpPath 服務器上存放文件的路徑* @param ftpUserName ftp服務賬號* @param ftpPassword ftp服務密碼* @param ftpHost ftp服務ip* @param ftpPort ftp服務端口* @param fileContent 文件內容* @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); // 設置PassiveMode傳輸 ftpClient.enterLocalPassiveMode(); // 設置以二進制流的方式傳輸 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 對遠程目錄的處理 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(); // 刪除本地臨時文件} else { uploadResult = "文件" + remoteFileName + "上傳失敗!";} return uploadResult;} catch (Exception e) { e.printStackTrace(); return uploadResult+"錯誤源: "+e.getMessage();}finally{ try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } /*** 文件寫出到本地* @param fileName 文件名* @param fileContext 文件內容* @param writeTempFielPath 本地存儲路徑* @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 = "文件不存在,創建失敗 !";} } 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服務器下載文件 * @param ftpHost FTP服務器IP * @param port FTP服務器端口 * @param username FTP登錄賬號 * @param password FTP登錄密碼 * @param remotePath FTP服務器上的相對路徑 * @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 "服務連接失敗 !"; } ftp.changeWorkingDirectory(remotePath); // 轉移到FTP服務器目錄 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方法可以用這個方法代替,直接上傳整個文件,而不作用把文件內容作為參數,此方法主體代碼來自網絡:
?
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 生成目標文件 * @return true||false */ public static boolean uploadFile(String targetFname){ int ftpPort = 0; String ftpUserName = ""; // ftp服務賬號String ftpPassword = ""; // ftp服務密碼String ftpHost = ""; // ftp服務ipString ftpPath = ""; // ftp服務器上存放文件的路徑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); //設置上傳目錄 ftpClient.changeWorkingDirectory(ftpPath); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("GBK"); //設置文件類型(二進制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //上傳 flag = ftpClient.storeFile(targetFname, fis); } catch (Exception e) { e.printStackTrace(); closeCon(); }finally{ try {fis.close();System.out.println("運行結束!----");} 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(); } } } } }
?
?
?
?
?
四、測試類:
?
?
<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服務賬號String ftpPassword = ""; // ftp服務密碼String ftpHost = ""; // ftp服務ipString ftpPath = ""; // ftp服務器上存放文件的路徑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("文件下載結果為:" + result); // 上傳ftpPath = ftpPath + "/" + "JiangYu.csv"; // JiangYu.csv:上傳文件的名稱FtpUtil.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, "這里是文件內容", writeTempFielPath); } catch (Exception e) { e.printStackTrace(); } }
} </strong>
?
?
注: ?測試類運行后下載成功的文件 和 上傳時的臨時文件是一樣的名字,會被上傳成功后刪除臨時文件操作所刪除。
?建議上傳和下載分開測試。
?
五、 上傳、下載結果:
?
?