這里使用Apache的FTP jar 包
沒有使用Java自帶的FTPjar包
工具類
package com.zit.ftp; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.SocketException; import java.util.Properties; 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; import com.zit.adapter.camera.CameraListener; public class FTPUtil { private static Logger logger = Logger.getLogger(FTPUtil.class); private static String classPath=CameraListener.class.getResource("/").getPath(); private static String filesPath = classPath.substring(0, classPath.indexOf("WEB-INF")) + "file" ; private FTPClient ftpClient; //從本地文件獲取各種屬性 private static String ftpIP=FTPConfig.getFTPHost(); private static Integer ftpPort=Integer.valueOf(FTPConfig.getFTPPort()); private static String ftpUserName=FTPConfig.getUserName(); private static String ftpPassword=FTPConfig.getPassword(); private static String ftpEncode = FTPConfig.getFTPEncode(); private static String localPath=FTPConfig.getLocalFilePath(); public FTPUtil() { } public synchronized boolean connectServer() { ftpClient = new FTPClient(); ftpClient.setControlEncoding(ftpEncode);//解決上傳文件時文件名亂碼 int reply = 0 ; try { // 連接至服務器 ftpClient.connect(ftpIP,ftpPort); // 登錄服務器 ftpClient.login(ftpUserName, ftpPassword); //登陸成功,返回碼是230 reply = ftpClient.getReplyCode(); // 判斷返回碼是否合法 if(!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); return false; } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return true; } //判斷ftp服務器文件是否存在 public boolean existFile(String path) { boolean flag = false; FTPFile[] ftpFileArr; try { ftpFileArr = ftpClient.listFiles(path); if (ftpFileArr.length > 0) { flag = true; } } catch (IOException e) { e.printStackTrace(); } return flag; } //刪除ftp文件 public synchronized boolean deleteFile(String pathname, String filename){ boolean flag = false; try { System.out.println("開始刪除文件"); //切換FTP目錄 ftpClient.changeWorkingDirectory(pathname); ftpClient.dele(filename); ftpClient.logout(); flag = true; System.out.println("刪除文件成功"); } catch (Exception e) { System.out.println("刪除文件失敗"); e.printStackTrace(); } finally { if(ftpClient.isConnected()){ try{ ftpClient.disconnect(); }catch(IOException e){ e.printStackTrace(); } } } return flag; } //從FTP server下載到本地文件夾 public synchronized boolean download(String path){ boolean flag = false; FTPFile[] fs=null; try { fs = ftpClient.listFiles("aaa"); if(fs.length<0) { return flag; } //1、遍歷FTP路徑下所有文件 for(FTPFile file:fs){ // File localFile = new File(localPath+"/"+file.getName()); //2、保存到本地 OutputStream os = new FileOutputStream(localFile); //retrieveFile(FTP服務端的源路徑),這個路徑要和listFiles的路徑一致 ftpClient.retrieveFile("aaa/" + file.getName(), os); //3、刪除FTP中的上面保存的文件 //循環外關閉,讀一個關閉一次挺慢的 is.flush(); is.close(); } flag = true; } catch (IOException e) { e.printStackTrace(); } return flag; } public synchronized boolean upload(InputStream inputStream , String fileName , String path) { try { //切換工作路徑,設置上傳的路徑 ftpClient.changeWorkingDirectory(path); //設置1M緩沖 ftpClient.setBufferSize(1024); // 設置被動模式 ftpClient.enterLocalPassiveMode(); // 設置以二進制方式傳輸 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); /* * 第一個參數:服務器端文檔名 * 第二個參數:上傳文檔的inputStream * 在前面設置好路徑,緩沖,編碼,文件類型后,開始上傳 */ ftpClient.storeFile(fileName, inputStream); inputStream.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } catch (Exception e) { e.printStackTrace(); return false; } finally { closeClient(); } } public boolean checkSubfolder(String path, String subfolderName) { try { //切換到FTP根目錄 ftpClient.changeWorkingDirectory(path); //查看根目錄下是否存在該文件夾 InputStream is = ftpClient.retrieveFileStream(new String(subfolderName.getBytes("UTF-8"))); if (is == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) { //若不存在該文件夾,則創建文件夾 return createSubfolder(path,subfolderName); } if (is != null) { is.close(); return true; } } catch (IOException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } return false; } public synchronized boolean createSubfolder(String path,String subfolderName){ try { ftpClient.changeWorkingDirectory(path); ftpClient.makeDirectory(subfolderName); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return true; } /** * 斷開與遠程服務器的連接 */ public void closeClient(){ if (ftpClient != null && ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } }
測試類:
package com.zit.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import com.zit.util.FTPUtil; public class TestFTP { public static void main(String[] args) { FTPUtil ftpClient = new FTPUtil(); ftpClient.connectServer(); try { File file = new File("D:\\test.doc"); InputStream stream = new FileInputStream(file); String ftpPath = "D:\\FTP"; String fileName = "文件夾"; boolean b = ftpClient.checkSubfolder(ftpPath, fileName); if(stream != null && b) { ftpClient.upload(stream, "aaa.doc", fileName); } } catch (FileNotFoundException e) { e.printStackTrace(); } } }
實驗工具:
filezilla server(FTP服務端工具)
官網下載即可
步驟
點擊左上角小頭像
1、Add新增用戶,輸入用戶名
2、輸入密碼
3、Share folders 共享文件夾,就是設置FTP根目錄
4、Add選擇共享文件夾,在本地某文件夾即可
5、勾選該文件夾用戶的權限,都選上
6、點擊OK即可
實驗結果:
運行測試類,即可看到,我已經把某個文檔,上傳到FTP根目錄下了