SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式
SpringBoot集成FTP實(shí)現(xiàn)創(chuàng)建FTP連接,文件上傳功能;這里用到Apache commont-net;我這里搭建一個(gè)本地FTP服務(wù)器,這里我推薦我這篇文章:搭建本地測試FTP服務(wù)器,可以很輕松的搭建完成
環(huán)境
將Apache commont-net依賴放到pom.xml文件當(dāng)中
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.10.0</version>
</dependency>
簡單示例
一個(gè)簡單的參數(shù)配置文件
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* FTP參數(shù)配置文件
*
* @author chenlirun
* @since 2024/3/25
*/
@Data
@Component
@ConfigurationProperties(prefix = "spring.ftp")
public class FtpProperties {
/**
* 服務(wù)器地址
*/
private String host;
/**
* 服務(wù)器端口
*/
private int port;
/**
* 用戶名
*/
private String userName;
/**
* 密碼
*/
private String password;
/**
* 工作目錄
*/
private String baseUrl;
}
spring:
ftp:
host: localhost
port: 21
user-name: root
password: root
base-url: /demoFile
提供的demo
提供的一個(gè)簡單的創(chuàng)建FTP連接,文件上傳,最后關(guān)閉連接釋放資源。
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.beans.factory.annotation.Value;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
@Slf4j
public class FTPServer {
@Value("${spring.ftp.host}")
private String host;
@Value("${spring.ftp.port}")
private int port;
@Value("${spring.ftp.username}")
private String userName;
@Value("${spring.ftp.password}")
private String password;
@Value("${spring.ftp.base-url}")
private String baseUrl;
@SneakyThrows
public void uploadFile() {
// FTP服務(wù)器初始化屬性
FTPClient ftpClient = new FTPClient();
// 連接FTP服務(wù)器
ftpClient.connect(host, port);
if (!ftpClient.isConnected()) {
log.error("FTP服務(wù)器連接失敗");
}
// 登錄FTP服務(wù)器
boolean login = ftpClient.login(userName, password);
if (!login) {
ftpClient.logout();
ftpClient.disconnect();
log.error("FTP服務(wù)器登錄失敗");
}
// 設(shè)置FTP字符編碼
ftpClient.setControlEncoding("utf-8");
//設(shè)置超時(shí)時(shí)間
ftpClient.setDataTimeout(Duration.ofSeconds(3));
//設(shè)置傳輸文件的類型,這里我設(shè)置成二進(jìn)制,保證文件不丟包
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 設(shè)置被動(dòng)模式
ftpClient.enterLocalPassiveMode();
//切換FTP工作目錄
boolean isChangeWorkingDir = ftpClient.changeWorkingDirectory(baseUrl);
if (!isChangeWorkingDir) {
log.error("切換指定工作目錄失敗了!??!");
}
/**
* 上傳文件到FTP服務(wù)器
*/
// 將字符串轉(zhuǎn)成InputStream
InputStream inputStream = IOUtils.toInputStream("aaaa", StandardCharsets.UTF_8);//
String fileName = "demo.txt";
//將InputStream流上傳到FTP并保存成alarm.txt
boolean b = ftpClient.storeFile(fileName, inputStream);
if (!b) {
log.error("文件上傳FTP服務(wù)器失?。。?!");
}
// 關(guān)閉流,釋放資源
inputStream.close();
// 如果FTP處于連接狀態(tài),則關(guān)閉連接和登錄
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
}
}
FTPClient類方法簡單介紹
FTPClient類是Apache Commons Net庫中的一個(gè)類,用于實(shí)現(xiàn)FTP(文件傳輸協(xié)議)客戶端的功能。
這個(gè)類提供了許多方法,用于與FTP服務(wù)器建立連接、上傳文件、下載文件、列出目錄內(nèi)容、刪除文件等。
連接FTP服務(wù)器
- connect(String hostname, int port): 使用指定的主機(jī)名和端口號連接到FTP服務(wù)器。
- connect(String hostname): 使用默認(rèn)端口(通常是21)連接到FTP服務(wù)器
- login(String username, String password): 使用指定的用戶名和密碼登錄到FTP服務(wù)器。
文件上傳
- storeFile(String remoteFileName, InputStream localFileStream):將本地文件流上傳到FTP服務(wù)器,并指定遠(yuǎn)程文件名。
- appendFileStream(String remote): 以追加模式將本地文件上傳到FTP服務(wù)器。
文件下載
- retrieveFile(String remoteFileName, OutputStream localFileStream):從FTP服務(wù)器下載文件,并將內(nèi)容寫入本地文件流。
目錄操作
- changeWorkingDirectory(String pathname): 更改FTP服務(wù)器上的當(dāng)前工作目錄。
- listDirectories(): 列出當(dāng)前工作目錄下的所有目錄。
- listFiles(): 列出當(dāng)前工作目錄下的所有文件。
其他操作
- disconnect(): 斷開與FTP服務(wù)器的連接。
- logout(): 注銷FTP會話,通常在斷開連接之前調(diào)用。
- completePendingCommand(): 完成當(dāng)前未完成的FTP命令的執(zhí)行。
- allocate(int bytes): 為文件傳輸分配字節(jié)數(shù)組大小。
- 這只是一部分FTPClient類提供的方法。具體的方法建議查閱Apache Commons Net庫的官方文檔或相關(guān)資源。
主動(dòng)模式和被動(dòng)模式在FTP協(xié)議中的主要區(qū)別在于數(shù)據(jù)連接的建立方式:
主動(dòng)模式(Active Mode):
- 工作原理:客戶端在本地打開一個(gè)非特權(quán)端口(通常大于1023),并通過這個(gè)端口發(fā)送PORT命令給服務(wù)器,告訴服務(wù)器客戶端用于數(shù)據(jù)傳輸?shù)亩丝谔?。然后,服?wù)器使用其20端口(數(shù)據(jù)端口)主動(dòng)連接到客戶端指定的端口進(jìn)行數(shù)據(jù)傳輸。
- 安全性:由于服務(wù)器需要主動(dòng)連接到客戶端的端口,這可能引發(fā)一些安全問題,特別是當(dāng)客戶端位于防火墻或NAT設(shè)備后面時(shí)。
- 適用場景:適用于客戶端位于可以接受入站連接的網(wǎng)絡(luò)環(huán)境,且沒有防火墻或NAT設(shè)備限制的場景。
被動(dòng)模式(Passive Mode):
- 工作原理:客戶端發(fā)送PASV命令給服務(wù)器,服務(wù)器在本地打開一個(gè)端口(通常是高位的非特權(quán)端口),并通過PASV命令的響應(yīng)告訴客戶端這個(gè)端口號。然后,客戶端主動(dòng)連接到服務(wù)器指定的這個(gè)端口進(jìn)行數(shù)據(jù)傳輸。
- 安全性:由于客戶端主動(dòng)連接到服務(wù)器,這種模式更適合于客戶端位于防火墻或NAT設(shè)備后面的場景,因?yàn)檫@些設(shè)備通常允許出站連接但限制入站連接。
- 適用場景: 特別適用于網(wǎng)絡(luò)環(huán)境不穩(wěn)定、存在防火墻或NAT設(shè)備的場景。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java中l(wèi)ist使用時(shí)需避免的場景總結(jié)
眾所周知,Java為開發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會導(dǎo)致諸多問題,所以本文我們就來看一看幾個(gè)錯(cuò)誤使用List的場景吧2023-10-10
Java 利用binarySearch實(shí)現(xiàn)抽獎(jiǎng)計(jì)算邏輯
這篇文章主要介紹了Java 利用binarySearch實(shí)現(xiàn)抽獎(jiǎng)計(jì)算邏輯,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12
struts2實(shí)現(xiàn)文件上傳顯示進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了struts2實(shí)現(xiàn)文件上傳顯示進(jìn)度條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
SpringBoot使用ResponseBodyEmitter處理流式日志和進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用ResponseBodyEmitter處理流式日志和進(jìn)度條,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猨ava中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程
Spring?Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架,接下來通過本文給大家介紹SpringBoot?Security從入門到實(shí)戰(zhàn)示例教程,感興趣的朋友一起看看吧2022-05-05
Spring中的AutowireCandidateResolver的具體使用詳解
這篇文章主要介紹了Spring中的AutowireCandidateResolver的具體使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

