国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Spring FTP上傳下載工具類遇到問題小結

2024-07-13 10:14:27
字體:
來源:轉載
供稿:網友

前言

最近在項目中需要和ftp服務器進行交互,在網上找了一下關于ftp上傳下載的工具類,大致有兩種。

  第一種是單例模式的類。

  第二種是另外定義一個Service,直接通過Service來實現ftp的上傳下載。

  這兩種感覺都有利弊。

  第一種實現了代碼復用,但是配置信息全需要寫在類中,維護比較復雜。

  第二種如果是spring框架,可以通過propertis文件,動態的注入配置信息,但是又不能代碼復用。

  所以我打算自己實現一個工具類,來把上面的兩種優點進行整合。順便把一些上傳過程中一些常見的問題也給解決了。

  因為我使用的是spring框架,如果把工具類聲明為bean給spring管理,他默認就是單例的,所以不需要我再實現單例。并且因為是bean,所以我可以把properties文件的屬性注入bean的屬性中,實現解耦,下面是具體代碼:

package com.cky.util;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;//使用spring自動生成單例對象,//@Componentpublic class FtpUtil {  //通過properties文件自動注入  @Value("${ftp.host}")  private String host;  //ftp服務器ip  @Value("${ftp.port}")  private int port;    //ftp服務器端口  @Value("${ftp.username}")  private String username;//用戶名  @Value("${ftp.password}")  private String password;//密碼  @Value("${ftp.basePath}")  private String basePath;//存放文件的基本路徑  //測試的時候把這個構造函數打開,設置你的初始值,然后在代碼后面的main方法運行測試  /*public FtpUtil() {    //System.out.println(this.toString());    host="192.168.100.77";    port=21;    username="ftpuser";    password="ftp54321";    basePath="/home/ftpuser/";  }*/  /**   *    * @param path    上傳文件存放在服務器的路徑   * @param filename  上傳文件名   * @param input    輸入流   * @return   */  public boolean fileUpload(String path,String filename,InputStream input) {    FTPClient ftp=new FTPClient();    try {      ftp.connect(host, port);      ftp.login(username, password);      //設置文件編碼格式      ftp.setControlEncoding("UTF-8");      //ftp通信有兩種模式        //PORT(主動模式)客戶端開通一個新端口(>1024)并通過這個端口發送命令或傳輸數據,期間服務端只使用他開通的一個端口,例如21        //PASV(被動模式)客戶端向服務端發送一個PASV命令,服務端開啟一個新端口(>1024),并使用這個端口與客戶端的21端口傳輸數據        //由于客戶端不可控,防火墻等原因,所以需要由服務端開啟端口,需要設置被動模式      ftp.enterLocalPassiveMode();      //設置傳輸方式為流方式      ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);      //獲取狀態碼,判斷是否連接成功      if(!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {        throw new RuntimeException("FTP服務器拒絕連接");      }      //轉到上傳文件的根目錄      if(!ftp.changeWorkingDirectory(basePath)) {        throw new RuntimeException("根目錄不存在,需要創建");      }      //判斷是否存在目錄      if(!ftp.changeWorkingDirectory(path)) {        String[] dirs=path.split("/");        //創建目錄        for (String dir : dirs) {          if(null==dir||"".equals(dir)) continue;          //判斷是否存在目錄          if(!ftp.changeWorkingDirectory(dir)) {            //不存在則創建            if(!ftp.makeDirectory(dir)) {              throw new RuntimeException("子目錄創建失敗");            }            //進入新創建的目錄            ftp.changeWorkingDirectory(dir);          }        }        //設置上傳文件的類型為二進制類型        ftp.setFileType(FTP.BINARY_FILE_TYPE);        //上傳文件        if(!ftp.storeFile(filename, input)) {          return false;        }        input.close();        ftp.logout();        return true;      }    } catch (Exception e) {      throw new RuntimeException(e);    }finally {      if(ftp.isConnected()) {        try {          ftp.disconnect();        } catch (IOException e) {          throw new RuntimeException(e);        }      }    }    return false;  }  /**   *    * @param filename  文件名,注意!此處文件名為加路徑文件名,如:/2015/06/04/aa.jpg   * @param localPath  存放到本地第地址   * @return       */  public boolean downloadFile(String filename,String localPath) {    FTPClient ftp=new FTPClient();    try {      ftp.connect(host, port);      ftp.login(username, password);      //設置文件編碼格式      ftp.setControlEncoding("UTF-8");      //ftp通信有兩種模式        //PORT(主動模式)客戶端開通一個新端口(>1024)并通過這個端口發送命令或傳輸數據,期間服務端只使用他開通的一個端口,例如21        //PASV(被動模式)客戶端向服務端發送一個PASV命令,服務端開啟一個新端口(>1024),并使用這個端口與客戶端的21端口傳輸數據        //由于客戶端不可控,防火墻等原因,所以需要由服務端開啟端口,需要設置被動模式      ftp.enterLocalPassiveMode();      //設置傳輸方式為流方式      ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);      //獲取狀態碼,判斷是否連接成功      if(!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {        throw new RuntimeException("FTP服務器拒絕連接");      }      int index=filename.lastIndexOf("/");      //獲取文件的路徑      String path=filename.substring(0, index);      //獲取文件名      String name=filename.substring(index+1);      //判斷是否存在目錄      if(!ftp.changeWorkingDirectory(basePath+path)) {        throw new RuntimeException("文件路徑不存在:"+basePath+path);      }      //獲取該目錄所有文件      FTPFile[] files=ftp.listFiles();      for (FTPFile file : files) {        //判斷是否有目標文件        //System.out.println("文件名"+file.getName()+"---"+name);        if(file.getName().equals(name)) {          //System.out.println("找到文件");          //如果找到,將目標文件復制到本地          File localFile =new File(localPath+"/"+file.getName());          OutputStream out=new FileOutputStream(localFile);          ftp.retrieveFile(file.getName(), out);          out.close();        }      }      ftp.logout();      return true;    } catch (Exception e) {      throw new RuntimeException(e);    }finally {      if(ftp.isConnected()) {        try {          ftp.disconnect();        } catch (IOException e) {          throw new RuntimeException(e);        }      }    }  }  //兩個功能其中一個使用的話另一個需要注釋  public static void main(String []args) {    //上傳測試-----------------------------------    /*FileInputStream in;    try {      in=new FileInputStream(new File("C://Users//Administrator//Desktop//json.png"));      FtpUtil ftputil=new FtpUtil();      boolean flag=ftputil.fileUpload("/2015/06/04", "aa.jpg", in);      System.out.println(flag);    }catch (Exception e) {      e.printStackTrace();    }finally {    }*/    //下載測試--------------------------------------    String filename="/2015/06/04/aa.jpg";    String localPath="F://";    FtpUtil ftputil=new FtpUtil();    ftputil.downloadFile(filename, localPath);  }  //get set方法自己添加  //..............}

具體使用

第一步:配置spring加載properties文件

applicationContext.xml

<context:property-placeholder location="classpath:*.properties"/>  ftp.propertiesftp.host=192.168.100.77ftp.port=21ftp.username=ftpuserftp.password=ftp54321ftp.basePath=/home/ftpuser/

第二步:將工具類聲明為bean

xml方式

<bean id="ftpUtil" class="com.cky.util.FtpUtil">    <property name="host" value="${ftp.host}"></property>    <property name="port" value="${ftp.port}"></property>    <property name="username" value="${ftp.username}"></property>    <property name="password" value="${ftp.password}"></property>    <property name="basePath" value="${ftp.basePath}"></property>  </bean>

注解方式,組件掃描

<context:component-scan base-package="com.cky.util"></context:component-scan>

第三部:注入使用

@Autowired  private FtpUtil ftpUtil;

總結

以上所述是小編給大家介紹的Spring FTP上傳下載工具類遇到問題小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁阳县| 贵溪市| 嘉兴市| 禄劝| 油尖旺区| 天镇县| 凌海市| 车致| 永德县| 龙井市| 青铜峡市| 阳新县| 彭泽县| 竹溪县| 繁昌县| 独山县| 阜平县| 靖边县| 大竹县| 天水市| 瑞金市| 中西区| 曲阜市| 安图县| 那曲县| 玉溪市| 四会市| 高陵县| 辽中县| 贵德县| 鸡西市| 宁津县| 城步| 肇源县| 微博| 伊宁县| 吉林市| 华阴市| 绿春县| 高尔夫| 武安市|