java ftp上傳檔案 但是不支援併發
阿新 • • 發佈:2018-12-10
package com.dl.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.util.Map; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; public class FTPUtils { //ftp伺服器地址 // private static String hostname = ReadRootPathUtils.getItemsPath(); //ftp伺服器埠號預設為21 // private static Integer port = 21 ; //ftp登入賬號 // private static String username = "root"; //ftp登入密碼 // private static String password = "123"; private static FTPClient ftpClient = null; /** * 初始化ftp伺服器 */ public static void initFtpClient() { Map<String, String> ftp = ReadRootPathUtils.getFTP(); ftpClient = new FTPClient(); ftpClient.setControlEncoding("utf-8"); try { System.out.println("connecting...ftp伺服器:"+ftp.get("ftpIp")+":"+ftp.get("port")); ftpClient.connect(ftp.get("ftpIp"), Integer.parseInt(ftp.get("port"))); //連線ftp伺服器 ftpClient.login(ftp.get("userName"),ftp.get("pwd") ); //登入ftp伺服器 int replyCode = ftpClient.getReplyCode(); //是否成功登入伺服器 if(!FTPReply.isPositiveCompletion(replyCode)){ System.out.println("connect failed...ftp伺服器:"+ftp.get("ftpIp")+":"+ftp.get("port")); } System.out.println("connect successfu...ftp伺服器:"+ftp.get("ftpIp")+":"+ftp.get("port")); }catch (MalformedURLException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } /** * 上傳檔案 * @param pathname ftp服務儲存地址 * @param fileName 上傳到ftp的檔名 * @param originfilename 待上傳檔案的名稱(絕對地址) * * @return */ public static boolean uploadFile( String pathname, String fileName,String originfilename){ boolean flag = false; InputStream inputStream = null; try{ System.out.println("開始上傳檔案"); //把檔案轉化為流 inputStream = new FileInputStream(new File(originfilename)); //初始化ftp initFtpClient(); //設定編碼 ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE); //檔案需要儲存的路徑 CreateDirecroty(pathname); // ftpClient.makeDirectory(pathname); // ftpClient.changeWorkingDirectory(pathname); // ftpClient.storeFile(fileName, inputStream); inputStream.close(); 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(); } } if(null != inputStream){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return true; } /** * 上傳檔案 * @param pathname ftp服務儲存地址 * @param fileName 上傳到ftp的檔名 * @param inputStream 輸入檔案流 * @return */ public static boolean uploadFile( String pathname, String fileName,InputStream inputStream){ boolean flag = false; try{ System.out.println("開始上傳檔案"); initFtpClient(); ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE); CreateDirecroty(pathname); ftpClient.makeDirectory(pathname); ftpClient.changeWorkingDirectory(pathname); ftpClient.storeFile(fileName, inputStream); inputStream.close(); 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(); } } if(null != inputStream){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return true; } //改變目錄路徑 public static boolean changeWorkingDirectory(String directory) { boolean flag = true; try { flag = ftpClient.changeWorkingDirectory(directory); if (flag) { System.out.println("進入資料夾" + directory + " 成功!"); } else { System.out.println("進入資料夾" + directory + " 失敗!開始建立資料夾"); } } catch (IOException ioe) { ioe.printStackTrace(); } return flag; } //建立多層目錄檔案,如果有ftp伺服器已存在該檔案,則不建立,如果無,則建立 public static boolean CreateDirecroty(String remote) throws IOException { boolean success = true; String directory = remote + "/"; // 如果遠端目錄不存在,則遞迴建立遠端伺服器目錄 if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) { int start = 0; int end = 0; if (directory.startsWith("/")) { start = 1; } else { start = 0; } end = directory.indexOf("/", start); String path = ""; String paths = ""; while (true) { String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1"); path = path + "/" + subDirectory; if (!existFile(path)) { if (makeDirectory(subDirectory)) { changeWorkingDirectory(subDirectory); } else { System.out.println("建立目錄[" + subDirectory + "]失敗"); changeWorkingDirectory(subDirectory); } } else { changeWorkingDirectory(subDirectory); } paths = paths + "/" + subDirectory; start = end + 1; end = directory.indexOf("/", start); // 檢查所有目錄是否建立完畢 if (end <= start) { break; } } } return success; } //判斷ftp伺服器檔案是否存在 public static boolean existFile(String path) throws IOException { boolean flag = false; FTPFile[] ftpFileArr = ftpClient.listFiles(path); if (ftpFileArr.length > 0) { flag = true; } return flag; } //建立目錄 public static boolean makeDirectory(String dir) { boolean flag = true; try { flag = ftpClient.makeDirectory(dir); if (flag) { System.out.println("建立資料夾" + dir + " 成功!"); } else { System.out.println("建立資料夾" + dir + " 失敗!"); } } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 下載檔案 * * @param pathname FTP伺服器檔案目錄 * * @param filename 檔名稱 * * @param localpath 下載後的檔案路徑 * * @return */ public static boolean downloadFile(String pathname, String filename, String localpath){ boolean flag = false; OutputStream os=null; try { System.out.println("開始下載檔案"); initFtpClient(); //切換FTP目錄 ftpClient.changeWorkingDirectory(pathname); FTPFile[] ftpFiles = ftpClient.listFiles(); for(FTPFile file : ftpFiles){ if(filename.equalsIgnoreCase(file.getName())){ File localFile = new File(localpath + "/" + file.getName()); os = new FileOutputStream(localFile); ftpClient.retrieveFile(file.getName(), os); os.close(); } } 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(); } } if(null != os){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return flag; } //讀取檔案 public static boolean readFile(String pathname, String filename, String localpath){ boolean flag = false; OutputStream os=null; try { System.out.println("開始下載檔案"); initFtpClient(); //切換FTP目錄 ftpClient.changeWorkingDirectory(pathname); FTPFile[] ftpFiles = ftpClient.listFiles(); for(FTPFile file : ftpFiles){ if(filename.equalsIgnoreCase(file.getName())){ File localFile = new File("/usr/dlconfig/temp/" + file.getName()); os = new FileOutputStream(localFile); ftpClient.retrieveFile(file.getName(), os); os.close(); } } 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(); } } if(null != os){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return flag; } /** * 刪除檔案 * * @param pathname FTP伺服器儲存目錄 * * @param filename 要刪除的檔名稱 * * @return */ public static boolean deleteFile(String pathname, String filename){ boolean flag = false; try { System.out.println("開始刪除檔案"); initFtpClient(); //切換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; } // public static void main(String[] args) { //// FtpUtils ftp =new FtpUtils(); // //ftp.uploadFile("ftpFile/data", "123.docx", "E://123.docx"); // //ftp.downloadFile("ftpFile/data", "123.docx", "F://"); //// ftp.deleteFile("ftpFile/data", "123.docx"); //// System.out.println("ok"); // FTPUtils f = new FTPUtils(); // f.initFtpClient(); // // // } }