最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合apache ftpserver詳細(xì)教程(推薦)

 更新時(shí)間:2020年01月14日 15:56:27   作者:會(huì)煉鋼的小白龍  
這篇文章主要介紹了springboot整合apache ftpserver詳細(xì)教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、Apache ftpserver相關(guān)簡介

  Apache FtpServer是100%純Java FTP服務(wù)器。它被設(shè)計(jì)為基于當(dāng)前可用的開放協(xié)議的完整且可移植的FTP服務(wù)器引擎解決方案。FtpServer可以作為Windows服務(wù)或Unix / Linux守護(hù)程序獨(dú)立運(yùn)行,也可以嵌入Java應(yīng)用程序中。我們還提供對Spring應(yīng)用程序內(nèi)集成的支持,并以O(shè)SGi捆綁軟件的形式提供我們的發(fā)行版。默認(rèn)的網(wǎng)絡(luò)支持基于高性能異步IO庫Apache MINA。使用MINA,F(xiàn)tpServer可以擴(kuò)展到大量并發(fā)用戶。

二、Apache ftpserver相關(guān)特性

  • 100%純Java,免費(fèi)的開源可恢復(fù)FTP服務(wù)器
  • 多平臺(tái)支持和多線程設(shè)計(jì)。
  • 用戶虛擬目錄,寫入權(quán)限,空閑超時(shí)和上載/下載帶寬限制支持。
  • 匿名登錄支持。
  • 上傳和下載文件都是可恢復(fù)的。
  • 處理ASCII和二進(jìn)制數(shù)據(jù)傳輸。
  • 支持IP限制以禁止IP。
  • 數(shù)據(jù)庫和文件可用于存儲(chǔ)用戶數(shù)據(jù)。
  • 所有FTP消息都是可定制的。
  • 隱式/顯式SSL / TLS支持。
  • MDTM支持-您的用戶可以更改文件的日期時(shí)間戳。
  • “模式Z”支持更快地上傳/下載數(shù)據(jù)。
  • 可以輕松添加自定義用戶管理器,IP限制器,記錄器。
  • 可以添加用戶事件通知(Ftplet)。

三、Apache ftpserver簡單部署使用(基于windows下,linux大同小異)

1、根據(jù)需要下載對應(yīng)版本的部署包:https://mina.apache.org/ftpserver-project/downloads.html

2、解壓部署包并調(diào)整.\res\conf\users.properties和.\res\conf\ftpd-typical.xml配置文件


users.properties文件配置

例如配置一個(gè)bxl用戶:
 #密碼 配置新的用戶
 ftpserver.user.bxl.userpassword=123456
 #主目錄,這里可以自定義自己的主目錄
 ftpserver.user.bxl.homedirectory=./res/bxl-home
 #當(dāng)前用戶可用
 ftpserver.user.bxl.enableflag=true
 #具有上傳權(quán)限
 ftpserver.user.bxl.writepermission=true
 #最大登陸用戶數(shù)為20
 ftpserver.user.bxl.maxloginnumber=20
 #同IP登陸用戶數(shù)為2
 ftpserver.user.bxl.maxloginperip=2
 #空閑時(shí)間為300秒
 ftpserver.user.bxl.idletime=300
 #上傳速率限制為480000字節(jié)每秒
 ftpserver.user.bxl.uploadrate=48000000
 #下載速率限制為480000字節(jié)每秒
 ftpserver.user.bxl.downloadrate=48000000

ftpd-typical.xml文件配置

 <server xmlns="http://mina.apache.org/ftpserver/spring/v1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd" id="myServer">
  <listeners>
   <nio-listener name="default" port="2121">
    <ssl>
     <keystore file="./res/ftpserver.jks" password="password" />
    </ssl>
    <!--注意:如果要支持外網(wǎng)連接,需要使用被動(dòng)模式passive,默認(rèn)開啟主動(dòng)模式-->
    <data-connection idle-timeout="60">
     <active enabled="true" ip-check="true" />
     <!-- <passive ports="2000-2222" address="0.0.0.0" external-address="xxx.xxx.xxx.xxx" /> -->
    </data-connection>
    <!--添加ip黑名單-->
    <blacklist>127.0.0.1</blacklist>
   </nio-listener>
  </listeners>
  
  <!--這里添加encrypt-passwords="clear",去掉密碼加密-->
  <file-user-manager file="./res/conf/users.properties" encrypt-passwords="clear" />
 </server>

3、啟動(dòng)并訪問

首先啟動(dòng)服務(wù),打開cmd并cd到bin路徑執(zhí)行.\ftpd.bat res/conf/ftpd-typical.xml,看到如下狀態(tài)說明啟動(dòng)成功

測試訪問,打開瀏覽器輸入:ftp://localhost:2121/就會(huì)看到你的文件目錄了,如果沒有配置匿名用戶,則會(huì)要求你輸入用戶名密碼,正是你在user.properties中配置的

四、Springboot整合Apache ftpserver(重點(diǎn))

方式一:獨(dú)立部署ftpserver服務(wù)

  這種方式比較簡單,只要把服務(wù)部署好即可,然后通過FtpClien來完成相關(guān)操作,同jedis訪問redis服務(wù)一個(gè)道理,沒啥可說的。主要注意一下ftpserver的訪問模式,如果要支持外網(wǎng)連接,需要使用被動(dòng)模式passive。

方式二:將ftpserver服務(wù)內(nèi)嵌到springboot服務(wù)中

  這種方式需要和springboot整合在一起,相對比較復(fù)雜,但這種方式下ftpserver會(huì) 隨著springboot服務(wù)啟動(dòng)或關(guān)閉而開啟或銷毀。具體使用哪種方式就看自己的業(yè)務(wù)需求了。

  簡單說一下我的實(shí)現(xiàn)的方案,ftpserver支持配置文件和db兩種方式來保存賬號信息和其它相關(guān)配置,如果我們的業(yè)務(wù)系統(tǒng)需要將用戶信息和ftp的賬號信息打通,并且還有相關(guān)的業(yè)務(wù)統(tǒng)計(jì),比如統(tǒng)計(jì)系統(tǒng)中每個(gè)人上傳文件的時(shí)間、個(gè)數(shù)等等,那么使用數(shù)據(jù)庫來保存ftp賬號信息還是比較方便靈活的。我這里就選擇使用mysql了。

開始整合

1、項(xiàng)目添加依賴

//這些只是apache ftpserver相關(guān)的依賴,springboot項(xiàng)目本身的依賴大家自己添加即可
<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.7.25 </version>
</dependency>
<dependency>
 <groupId>org.apache.ftpserver</groupId>
 <artifactId>ftpserver-core</artifactId>
 <version>1.1.1</version>
</dependency>
<dependency>
 <groupId>org.apache.ftpserver</groupId>
 <artifactId>ftplet-api</artifactId>
 <version>1.1.1</version>
</dependency>

<dependency>
 <groupId>org.apache.mina</groupId>
 <artifactId>mina-core</artifactId>
 <version>2.0.16</version>
</dependency> 

 

2、數(shù)據(jù)庫建表用來保存相關(guān)的賬戶信息(大家可以手動(dòng)添加幾條用來測試),具體字段意思參考users.properties文件配置(可以想象一下以后我們的系統(tǒng)每注冊一個(gè)用戶都可以為其添加一條ftp_user信息,用來指定保存用戶的上傳數(shù)據(jù)等等)

CREATE TABLE FTP_USER (  
 userid VARCHAR(64) NOT NULL PRIMARY KEY,  
 userpassword VARCHAR(64),  
 homedirectory VARCHAR(128) NOT NULL,    
 enableflag BOOLEAN DEFAULT TRUE, 
 writepermission BOOLEAN DEFAULT FALSE,  
 idletime INT DEFAULT 0,    
 uploadrate INT DEFAULT 0,    
 downloadrate INT DEFAULT 0,
 maxloginnumber INT DEFAULT 0,
 maxloginperip INT DEFAULT 0
);

3、配置ftpserver,提供ftpserver的init()、start()、stop()方法

import com.mysql.cj.jdbc.MysqlDataSource;
import com.talkingdata.tds.ftpserver.plets.MyFtpPlet;
import org.apache.commons.io.IOUtils;
import org.apache.ftpserver.DataConnectionConfigurationFactory;
import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.Ftplet;
import org.apache.ftpserver.listener.Listener;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.ssl.SslConfigurationFactory;
import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
import org.apache.ftpserver.usermanager.DbUserManagerFactory;
import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
 * 注意:被@Configuration標(biāo)記的類會(huì)被加入ioc容器中,而且類中所有帶 @Bean注解的方法都會(huì)被動(dòng)態(tài)代理,因此調(diào)用該方法返回的都是同一個(gè)實(shí)例。
 * ftp服務(wù)訪問地址:
 *  ftp://localhost:3131/
 */
@Configuration("MyFtp")
public class MyFtpServer {
 private static final Logger logger = LoggerFactory.getLogger(MyFtpServer.class);
 //springboot配置好數(shù)據(jù)源直接注入即可
 @Autowired
 private DataSource dataSource;
 protected FtpServer server;
 //我們這里利用spring加載@Configuration的特性來完成ftp server的初始化
 public MyFtpServer(DataSource dataSource) {
  this.dataSource = dataSource;
  initFtp();
  logger.info("Apache ftp server is already instantiation complete!");
 }
 /**
  * ftp server init
  * @throws IOException
  */
 public void initFtp() {
  FtpServerFactory serverFactory = new FtpServerFactory();
  ListenerFactory listenerFactory = new ListenerFactory();
  //1、設(shè)置服務(wù)端口
  listenerFactory.setPort(3131);
  //2、設(shè)置被動(dòng)模式數(shù)據(jù)上傳的接口范圍,云服務(wù)器需要開放對應(yīng)區(qū)間的端口給客戶端
  DataConnectionConfigurationFactory dataConnectionConfFactory = new DataConnectionConfigurationFactory();
  dataConnectionConfFactory.setPassivePorts("10000-10500");
  listenerFactory.setDataConnectionConfiguration(dataConnectionConfFactory.createDataConnectionConfiguration());
  //3、增加SSL安全配置
//  SslConfigurationFactory ssl = new SslConfigurationFactory();
//  ssl.setKeystoreFile(new File("src/main/resources/ftpserver.jks"));
//  ssl.setKeystorePassword("password");
  //ssl.setSslProtocol("SSL");
  // set the SSL configuration for the listener
//  listenerFactory.setSslConfiguration(ssl.createSslConfiguration());
//  listenerFactory.setImplicitSsl(true);
  //4、替換默認(rèn)的監(jiān)聽器
  Listener listener = listenerFactory.createListener();
  serverFactory.addListener("default", listener);
  //5、配置自定義用戶事件
  Map<String, Ftplet> ftpLets = new HashMap();
  ftpLets.put("ftpService", new MyFtpPlet());
  serverFactory.setFtplets(ftpLets);
  //6、讀取用戶的配置信息
  //注意:配置文件位于resources目錄下,如果項(xiàng)目使用內(nèi)置容器打成jar包發(fā)布,F(xiàn)TPServer無法直接直接讀取Jar包中的配置文件。
  //解決辦法:將文件復(fù)制到指定目錄(本文指定到根目錄)下然后FTPServer才能讀取到。
//  PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
//  String tempPath = System.getProperty("java.io.tmpdir") + System.currentTimeMillis() + ".properties";
//  File tempConfig = new File(tempPath);
//  ClassPathResource resource = new ClassPathResource("users.properties");
//  IOUtils.copy(resource.getInputStream(), new FileOutputStream(tempConfig));
//  userManagerFactory.setFile(tempConfig);
//  userManagerFactory.setPasswordEncryptor(new ClearTextPasswordEncryptor()); //密碼以明文的方式
//  serverFactory.setUserManager(userManagerFactory.createUserManager());
  //6.2、基于數(shù)據(jù)庫來存儲(chǔ)用戶實(shí)例
  DbUserManagerFactory dbUserManagerFactory = new DbUserManagerFactory();
  //todo....
  dbUserManagerFactory.setDataSource(dataSource);
  dbUserManagerFactory.setAdminName("admin");
  dbUserManagerFactory.setSqlUserAdmin("SELECT userid FROM FTP_USER WHERE userid='{userid}' AND userid='admin'");
  dbUserManagerFactory.setSqlUserInsert("INSERT INTO FTP_USER (userid, userpassword, homedirectory, " +
    "enableflag, writepermission, idletime, uploadrate, downloadrate) VALUES " +
    "('{userid}', '{userpassword}', '{homedirectory}', {enableflag}, " +
    "{writepermission}, {idletime}, uploadrate}, {downloadrate})");
  dbUserManagerFactory.setSqlUserDelete("DELETE FROM FTP_USER WHERE userid = '{userid}'");
  dbUserManagerFactory.setSqlUserUpdate("UPDATE FTP_USER SET userpassword='{userpassword}',homedirectory='{homedirectory}',enableflag={enableflag},writepermission={writepermission},idletime={idletime},uploadrate={uploadrate},downloadrate={downloadrate},maxloginnumber={maxloginnumber}, maxloginperip={maxloginperip} WHERE userid='{userid}'");
  dbUserManagerFactory.setSqlUserSelect("SELECT * FROM FTP_USER WHERE userid = '{userid}'");
  dbUserManagerFactory.setSqlUserSelectAll("SELECT userid FROM FTP_USER ORDER BY userid");
  dbUserManagerFactory.setSqlUserAuthenticate("SELECT userid, userpassword FROM FTP_USER WHERE userid='{userid}'");
  dbUserManagerFactory.setPasswordEncryptor(new ClearTextPasswordEncryptor());
  serverFactory.setUserManager(dbUserManagerFactory.createUserManager());
  //7、實(shí)例化FTP Server
  server = serverFactory.createServer();
 }
 /**
  * ftp server start
  */
 public void start(){
  try {
   server.start();
   logger.info("Apache Ftp server is starting!");
  }catch(FtpException e) {
   e.printStackTrace();
  }
 }
 /**
  * ftp server stop
  */
 public void stop() {
  server.stop();
  logger.info("Apache Ftp server is stoping!");
 }
}

4、配置監(jiān)聽器,使spring容器啟動(dòng)時(shí)啟動(dòng)ftpserver,在spring容器銷毀時(shí)停止ftpserver

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class FtpServerListener implements ServletContextListener {
 private static final Logger logger = LoggerFactory.getLogger(MyFtpServer.class);
 private static final String SERVER_NAME="FTP-SERVER";
 @Autowired
 private MyFtpServer server;
 //容器關(guān)閉時(shí)調(diào)用方法stop ftpServer
 public void contextDestroyed(ServletContextEvent sce) {
//  WebApplicationContext ctx= WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
//  MyFtpServer server=(MyFtpServer)ctx.getServletContext().getAttribute(SERVER_NAME);
  server.stop();
  sce.getServletContext().removeAttribute(SERVER_NAME);
  logger.info("Apache Ftp server is stoped!");
 }
 //容器初始化調(diào)用方法start ftpServer
 public void contextInitialized(ServletContextEvent sce) {
//  WebApplicationContext ctx= WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
//  MyFtpServer server=(MyFtpServer) ctx.getBean("MyFtp");
  sce.getServletContext().setAttribute(SERVER_NAME,server);
  try {
   //項(xiàng)目啟動(dòng)時(shí)已經(jīng)加載好了
   server.start();
   logger.info("Apache Ftp server is started!");
  } catch (Exception e){
   e.printStackTrace();
   throw new RuntimeException("Apache Ftp server start failed!", e);
  }
 }
}

5、通過繼承DefaultFtplet抽象類來實(shí)現(xiàn)一些自定義用戶事件(我這里只是舉例)

import org.apache.ftpserver.ftplet.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class MyFtpPlet extends DefaultFtplet {
 private static final Logger logger = LoggerFactory.getLogger(MyFtpPlet.class);
 @Override
 public FtpletResult onUploadStart(FtpSession session, FtpRequest request)
   throws FtpException, IOException {
  //獲取上傳文件的上傳路徑
  String path = session.getUser().getHomeDirectory();
  //獲取上傳用戶
  String name = session.getUser().getName();
  //獲取上傳文件名
  String filename = request.getArgument();
  logger.info("用戶:'{}',上傳文件到目錄:'{}',文件名稱為:'{}',狀態(tài):開始上傳~", name, path, filename);
  return super.onUploadStart(session, request);
 }
 @Override
 public FtpletResult onUploadEnd(FtpSession session, FtpRequest request)
   throws FtpException, IOException {
  //獲取上傳文件的上傳路徑
  String path = session.getUser().getHomeDirectory();
  //獲取上傳用戶
  String name = session.getUser().getName();
  //獲取上傳文件名
  String filename = request.getArgument();
  logger.info("用戶:'{}',上傳文件到目錄:'{}',文件名稱為:'{},狀態(tài):成功!'", name, path, filename);
  return super.onUploadEnd(session, request);
 }
 @Override
 public FtpletResult onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
  //todo servies...
  return super.onDownloadStart(session, request);
 }
 @Override
 public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
  //todo servies...
  return super.onDownloadEnd(session, request);
 }
}

6、 配置springboot靜態(tài)資源的訪問

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class FtpConfig implements WebMvcConfigurer {
 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
  //可以通過os來判斷
  String os = System.getProperty("os.name");
  //linux設(shè)置
//  registry.addResourceHandler("/ftp/**").addResourceLocations("file:/home/pic/");
  //windows設(shè)置
  //第一個(gè)方法設(shè)置訪問路徑前綴,第二個(gè)方法設(shè)置資源路徑,既可以指定項(xiàng)目classpath路徑,也可以指定其它非項(xiàng)目路徑
  registry.addResourceHandler("/ftp/**").addResourceLocations("file:D:\\apache-ftpserver-1.1.1\\res\\bxl-home\\");
  registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
 }
}

7、以上6步已經(jīng)完成ftpserver的配置,隨著springboot項(xiàng)目的啟動(dòng)就會(huì)開啟ftpserver服務(wù),下面在給大家貼一下客戶端的訪問的util,大家可以自行封裝一下即可。

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
import java.io.*;
public class FtpClientUtil {
 // ftp服務(wù)器ip地址
 private static String FTP_ADDRESS = "localhost";
 // 端口號
 private static int FTP_PORT = 3131;
 // 用戶名
 private static String FTP_USERNAME = "bxl";
 // 密碼
 private static String FTP_PASSWORD = "123456";
 // 相對路徑
 private static String FTP_BASEPATH = "";
 public static boolean uploadFile(String remoteFileName, InputStream input) {
  boolean flag = false;
  FTPClient ftp = new FTPClient();
  ftp.setControlEncoding("UTF-8");
  try {
   int reply;
   ftp.connect(FTP_ADDRESS, FTP_PORT);// 連接FTP服務(wù)器
   ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登錄
   reply = ftp.getReplyCode();
   System.out.println("登錄ftp服務(wù)返回狀態(tài)碼為:" + reply);
   if (!FTPReply.isPositiveCompletion(reply)) {
    ftp.disconnect();
    return flag;
   }
   ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
   //設(shè)置為被動(dòng)模式
   ftp.enterLocalPassiveMode();
   ftp.makeDirectory(FTP_BASEPATH);
   ftp.changeWorkingDirectory(FTP_BASEPATH);
   //originFilePath就是上傳文件的文件名,建議使用生成的唯一命名,中文命名最好做轉(zhuǎn)碼
   boolean a = ftp.storeFile(remoteFileName, input);
//   boolean a = ftp.storeFile(new String(remoteFileName.getBytes(),"iso-8859-1"),input);
   System.out.println("要上傳的原始文件名為:" + remoteFileName + ", 上傳結(jié)果:" + a);
   input.close();
   ftp.logout();
   flag = true;
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (ftp.isConnected()) {
    try {
     ftp.disconnect();
    } catch (IOException ioe) {
    }
   }
  }
  return flag;
 }
// public static Boolean uploadFile(String remoteFileName, InputStream inputStream, String ftpAddress, int ftpPort,
//          String ftpName, String ftpPassWord, String ftpBasePath) {
//  FTP_ADDRESS = ftpAddress;
//  FTP_PORT = ftpPort;
//  FTP_USERNAME = ftpName;
//  FTP_PASSWORD = ftpPassWord;
//  FTP_BASEPATH = ftpBasePath;
//  uploadFile(remoteFileName,inputStream);
//  return true;
// }
 public static boolean deleteFile(String filename) {
  boolean flag = false;
  FTPClient ftpClient = new FTPClient();
  try {
   // 連接FTP服務(wù)器
   ftpClient.connect(FTP_ADDRESS, FTP_PORT);
   // 登錄FTP服務(wù)器
   ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
   // 驗(yàn)證FTP服務(wù)器是否登錄成功
   int replyCode = ftpClient.getReplyCode();
   if (!FTPReply.isPositiveCompletion(replyCode)) {
    return flag;
   }
   // 切換FTP目錄
   ftpClient.changeWorkingDirectory(FTP_BASEPATH);
   ftpClient.dele(filename);
   ftpClient.logout();
   flag = true;
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (ftpClient.isConnected()) {
    try {
     ftpClient.logout();
    } catch (IOException e) {
    }
   }
  }
  return flag;
 }
 public static boolean downloadFile(String filename, String localPath) {
  boolean flag = false;
//  FTPSClient ftpClient = new FTPSClient("TLS", true);
  FTPClient ftpClient = new FTPClient();
  try {
   // 連接FTP服務(wù)器
   ftpClient.connect(FTP_ADDRESS, FTP_PORT);
   // 登錄FTP服務(wù)器
   ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
   // 驗(yàn)證FTP服務(wù)器是否登錄成功
   int replyCode = ftpClient.getReplyCode();
   if (!FTPReply.isPositiveCompletion(replyCode)) {
    return flag;
   }
   // 切換FTP目錄
   ftpClient.changeWorkingDirectory(FTP_BASEPATH);
   //此處為demo方法,正常應(yīng)該到數(shù)據(jù)庫中查詢fileName
   FTPFile[] ftpFiles = ftpClient.listFiles();
   for (FTPFile file : ftpFiles) {
    if (filename.equalsIgnoreCase(file.getName())) {
     File localFile = new File(localPath + "/" + file.getName());
     OutputStream os = new FileOutputStream(localFile);
     ftpClient.retrieveFile(file.getName(), os);
     os.close();
    }
   }
   ftpClient.logout();
   flag = true;
   System.out.println("文件下載完成?。。?);
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (ftpClient.isConnected()) {
    try {
     ftpClient.logout();
    } catch (IOException e) {
    }
   }
  }
  return flag;
 }
}

五、總結(jié)

到此,所有的配置已經(jīng)完成,我們的業(yè)務(wù)系統(tǒng)也同時(shí)也承擔(dān)了一個(gè)角色,那就是ftp服務(wù)器,整個(gè)配置是沒有加入SSL/TLS安全機(jī)制的,大家如果感興趣可以自行研究下。我代碼中注釋那那部分,只是注意下通過客戶端訪問時(shí),需要使用FtpsCliet,而非FtpCliet。當(dāng)然還需要配置你自己的ftpserver.jks文件,也就是java key store。百度下一下如何生成,很簡單哦!

相關(guān)文章

  • 淺談springboot內(nèi)置tomcat和外部獨(dú)立部署tomcat的區(qū)別

    淺談springboot內(nèi)置tomcat和外部獨(dú)立部署tomcat的區(qū)別

    這篇文章主要介紹了淺談springboot內(nèi)置tomcat和外部獨(dú)立部署tomcat的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • SpringBoot集成mybatis實(shí)例

    SpringBoot集成mybatis實(shí)例

    本篇文章主要介紹了SpringBoot集成mybatis實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringBoot快速入門詳解

    SpringBoot快速入門詳解

    springboot提供了一種快速使用spring的方式,基于coc的思想,即約定大于配置,通過本文學(xué)習(xí)快速掌握springboot入門知識,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • springboot 參數(shù)格式校驗(yàn)操作

    springboot 參數(shù)格式校驗(yàn)操作

    這篇文章主要介紹了springboot 參數(shù)格式校驗(yàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot3?Web編程開發(fā)的工程搭建攔截器及測試工具示例

    SpringBoot3?Web編程開發(fā)的工程搭建攔截器及測試工具示例

    這篇文章主要介紹了SpringBoot3?Web編程開發(fā)的工程搭建攔截器及測試工具示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java中OAuth2.0第三方授權(quán)原理與實(shí)戰(zhàn)

    Java中OAuth2.0第三方授權(quán)原理與實(shí)戰(zhàn)

    本文主要介紹了Java中OAuth2.0第三方授權(quán)原理與實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 一篇文章弄懂JVM類加載機(jī)制過程以及原理

    一篇文章弄懂JVM類加載機(jī)制過程以及原理

    JVM原理對于初學(xué)者而言,比較晦澀難以理解,概念繁多又比較抽象,很多時(shí)候感覺看不見摸不著,還不好驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于如何通過一篇文章弄懂JVM類加載機(jī)制過程及原理的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java中的WeakHashMap源碼分析

    Java中的WeakHashMap源碼分析

    這篇文章主要介紹了Java中的WeakHashMap源碼分析,WeakHashMap可能平時(shí)使用的頻率并不高,但是你可能聽過WeakHashMap會(huì)進(jìn)行自動(dòng)回收吧,下面就對其原理進(jìn)行分析,需要的朋友可以參考下
    2023-09-09
  • MyBatis Plus中InnerInterceptor的實(shí)現(xiàn)

    MyBatis Plus中InnerInterceptor的實(shí)現(xiàn)

    本文主要介紹了MyBatis Plus中InnerInterceptor的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)

    Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)

    這篇文章主要介紹了Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

工布江达县| 东安县| 周宁县| 平乐县| 阿尔山市| 紫阳县| 宜川县| 奈曼旗| 蒙阴县| 安西县| 泸定县| 红安县| 钟祥市| 顺昌县| 临汾市| 左贡县| 安远县| 稷山县| 九龙县| 二连浩特市| 乐清市| 海原县| 汉寿县| 景谷| 津市市| 达拉特旗| 从江县| 璧山县| 神池县| 长垣县| 邵武市| 宜宾县| 陕西省| 兴安盟| 武宁县| 井研县| 榆中县| 大化| 双辽市| 舞钢市| 台北县|