前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點選跳轉到教程。
源代碼大部分是網上找的,查來查去,找到幾個可以用的例子,改來改去,揉合成現在這個樣子。
一、 jar包準備(web service 的jar 不需要)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90EVNdXRURWNk1mYoxWbhZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zMzYzN0kzM1EDMycDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
二、配置檔案:
配置檔案内容:
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服務ip
String 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服務ip
String 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>
注: 測試類運作後下載下傳成功的檔案 和 上傳時的臨時檔案是一樣的名字,會被上傳成功後删除臨時檔案操作所删除。
建議上傳和下載下傳分開測試。
五、 上傳、下載下傳結果: