標籤:work pass pre enter 目錄 res file 名稱 filename
最近的一個項目跟ftp打交道很多,經常需要向ftp上傳、下載檔案,現在總結一下公用方法。
上傳
/** * 檔案上傳 * * @param ip * host * @param port * 連接埠 * @param userName * 使用者名稱 * @param passWord * 密碼 * @param localpath * 上傳檔案在本地磁碟路徑 * @param fileName * 檔案名稱 * @param remotePath * 檔案要上傳到ftp伺服器的路徑 * @throws Exception */ public static Boolean fileFtpUpload(String ip, int port, String userName, String passWord, String localpath, String fileName, String remotePath) throws Exception { FTPClient ftp = new FTPClient();// 建立用戶端對象 InputStream local = null; boolean flag = false; try { checkIsExsitFile(localpath, fileName);// 判斷本地路徑下有無該檔案 SocketAddress address = new InetSocketAddress(ip, port); ftp.connect(ip, port);// 串連 ftp.login(userName, passWord);// 登入 log.info("ftp伺服器串連、登陸成功,地址為:" + address); // 檢查上傳路徑是否存在 如果不存在返回false boolean flag1 = ftp.changeWorkingDirectory(remotePath); if (!flag1) { // 建立上傳的路徑 該方法只能建立一級目錄,在這裡如果/home/ftpuser存在則可建立image // ftp.makeDirectory(path); throw new Exception("ftp伺服器上沒有指定檔案目錄,請先建立:" + remotePath); } // 指定上傳路徑 ftp.changeWorkingDirectory(remotePath); // 指定上傳檔案的類型 二進位檔案 ftp.setFileType(FTP.BINARY_FILE_TYPE); // 讀取本地檔案 File file = new File(localpath + "\\" + fileName); local = new FileInputStream(file); // 第一個參數是檔案名稱 ftp.storeFile(file.getName(), local); log.info("上傳成功"); flag = true; } catch (SocketException e) { log.info("上傳失敗" + e); flag = false; e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 關閉檔案流 local.close(); // 退出 ftp.logout(); // 中斷連線 ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } return flag; }
上傳檔案之前需要先判斷磁碟下有無指定檔案,判斷方法如下:
/** * 判斷檔案路徑下有無指定檔案 * * @param filePath * 組建檔案名稱 * @param fileName * 檔案名稱 * @return 是否建立成功,成功則返回true */public static void checkIsExsitFile(String filePath, String fileName) {File dirFile = new File(filePath);// 檔案夾對象try {File[] files = dirFile.listFiles();Boolean bl = false;for (File file1 : files) {if (fileName.equals(file1.getName())) {bl = true;break;}}// 如果檔案夾內檔案不存在,則報錯if (!bl) {throw new Exception("檔案路徑下沒有指定上傳檔案");}} catch (Exception e) {e.printStackTrace();}}
注意在上傳之前一定要先切換到目前的目錄,即這一行
// 指定上傳路徑ftp.changeWorkingDirectory(remotePath);
同時需要指定上傳檔案的類型
// 指定上傳檔案的類型 二進位檔案ftp.setFileType(FTP.BINARY_FILE_TYPE);
下載
/** * ftp下載檔案 * * @param ip * @param port * @param userName * @param passWord * @param localPath * @param remotePath * @param fileContainsName * 檔案包含名 * @return * @throws Exception */ public static String fileFtpDown(String ip, int port, String userName, String passWord, String localPath, String remotePath, String fileContainsName) throws Exception { FTPClient ftpClient = new FTPClient();// 建立用戶端對象 String fileName = ""; SocketAddress address = new InetSocketAddress(ip, port); ftpClient.connect(ip, port);// 串連 boolean login = ftpClient.login(userName, passWord);// 登陸 if (login) { try { log.info("ftp伺服器串連、登陸成功,地址為:" + address); ftpClient.enterLocalPassiveMode();// 開通一個連接埠來傳輸資料 FTPFile[] fs = ftpClient.listFiles(remotePath);// fs為remoteFile下所有檔案集合 for (FTPFile ff : fs) { String f = new String(ff.getName().getBytes("iso-8859-1"), "utf-8"); if (f.contains(fileContainsName)) {// 檔案名稱不確定時用contains File localFile = new File(localPath + "\\" + f); // 在本地指定路徑建立了一個對象 OutputStream is = new FileOutputStream(localFile); ftpClient.changeWorkingDirectory(remotePath);// 設定下載檔案相對遠程FTP根目錄所處的路徑 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 開始下載檔案前設定傳輸類型 ftpClient.retrieveFile(ff.getName(), is); is.close(); fileName = f; } break; } } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } } else { log.info("ftp伺服器串連、登陸失敗"); } return fileName; }
Java中向ftp上傳、下載檔案