FTP資料上傳下載下傳用到的開發包是commons-net-1.4.1.jar
現在本機上配置一個ftp伺服器目錄,配置完成後的參數資訊:
final static String HOST="172.20.16.76"; //本機ip位址
final static int PORT=9500; //FTP端口号
final static String USERNAME="lyc"; //FTP使用者名
final static String PASSWORD="123456"; //FTP登入密碼
final static String LOCAL_DIRECTORY="E:/delphi7Project/ftpDownload"; //下載下傳到本地時目錄
檢索FTP全目錄,然後遞歸循環下載下傳檔案
public static void doDownload(String path) throws IOException{
//建立本地目錄
makeDirs(path);
//切換工作目錄
ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
//擷取目錄下的檔案清單
String[] fileNames = ftpClient.listNames();
//循環下載下傳FTP目錄下的檔案
for(String fname:fileNames){
if(isDirectory(path+"/"+fname)){
//遞歸調用
doDownload(path+"/"+fname);
}else{
//下載下傳單個檔案
downloadFile(path+"/"+fname);
}
}
}
全文代碼如下:
package com.test;
import org.apache.commons.net.ftp.FTPClient;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.SocketException;
import javax.swing.JFileChooser;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class FtpTest {
static FTPClient ftpClient;
<pre name="code" class="java"> final static String HOST="172.20.16.76";
final static int PORT=9500;
final static String USERNAME="lyc";
final static String PASSWORD="123456";
final static String LOCAL_DIRECTORY="E:/delphi7Project/ftpDownload";
public static void login() throws SocketException, IOException{
ftpClient = new FTPClient();
ftpClient.connect(HOST,PORT);
ftpClient.login(USERNAME, PASSWORD);
//設定編碼
ftpClient.setControlEncoding("GBK");
ftpClient.setBufferSize(8096);
}
//判斷給定的路徑是檔案還是檔案夾
public static boolean isDirectory(String path) throws IOException{
//如果是檔案,就會傳回false
//如果檔案夾或檔案名中含有中文,這裡要轉換一下,不然會傳回false
return ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
}
//判斷本地路徑是否存在,不存在就建立路徑
public static void makeDirs(String path){
File localFile = new File(LOCAL_DIRECTORY+path);
if(!localFile.exists()){
localFile.mkdirs();
}
}
//下載下傳單個檔案
public static void downloadFile(String dir) throws IOException{
File file = new File(LOCAL_DIRECTORY + dir);
OutputStream os = new FileOutputStream(file);
ftpClient.setControlEncoding("GBK");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//如果檔案名中含有中文,retrieveFile檔案時會找不到FTP上的檔案,導緻儲存在本地的是一個空檔案,是以也要轉換一下
ftpClient.retrieveFile(new String(file.getName().getBytes(),"ISO-8859-1"), os);
os.close();
}
//下載下傳任務,遞歸調用,循環下載下傳所有目錄下的檔案
public static void doDownload(String path) throws IOException{
//建立本地目錄
makeDirs(path);
//切換工作目錄
ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
//擷取目錄下的檔案清單
String[] fileNames = ftpClient.listNames();
//循環下載下傳FTP目錄下的檔案
for(String fname:fileNames){
if(isDirectory(path+"/"+fname)){
//遞歸調用
doDownload(path+"/"+fname);
}else{
//下載下傳單個檔案
downloadFile(path+"/"+fname);
}
}
}
//實時同步ftp目錄檔案到本地
public static class MyRun implements Runnable{
@Override
public void run() {
while(true){
try {
Thread.sleep(10*1000);
doDownload("/");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws SocketException, IOException {
//連接配接FTP伺服器
login();
//全目錄下載下傳
MyRun myRun = new MyRun();
new Thread(myRun).start();
//testUpload();
}
// FTP上傳檔案
public static void testUpload() {
FTPClient ftpClient = new FTPClient();
FileInputStream fis = null;
try {
ftpClient.connect("172.20.16.76",9500);
ftpClient.login("lyc", "123456");
JFileChooser fd = new JFileChooser();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch (Exception e) {
e.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(fd);
fd.showOpenDialog(null);
File srcFile = fd.getSelectedFile();
//if(srcFile != null){}
fis = new FileInputStream(srcFile);
//設定上傳目錄
ftpClient.changeWorkingDirectory("/img");
//ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//設定檔案類型(二進制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(srcFile.getName(), fis);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("FTP用戶端出錯!", e);
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("關閉FTP連接配接發生異常!", e);
}
}
}
}