SpringBoot訪問windows共享文件的方法
前言
最近有項(xiàng)目需要開發(fā)檔案打包下載功能,其中包含很多大附件,項(xiàng)目使用minio存儲(chǔ)且不在同一臺(tái)服務(wù)器上,為了優(yōu)化速度決定使用windows共享功能進(jìn)行文件傳輸
SMB1.0
集成jcifs類庫,主要適用于一些老舊系統(tǒng),但下載速度比較慢,僅作參考
此類庫沒有maven引用,官網(wǎng)地址:http://jcifs.samba.org/
注意事項(xiàng):
設(shè)置jcifs.smb.client.dfs.disabled選項(xiàng)開啟,可以提高傳輸速度
使用NtlmPasswordAuthentication認(rèn)證代替smb協(xié)議url攜帶用戶名密碼方式,避免特殊字符傳遞造成認(rèn)證失敗
public static void downloadFile(String ip, String shareFolder, String filePath, String localDir) throws Exception {
System.setProperty("jcifs.smb.client.dfs.disabled", "true");
String url = getFileUrl(ip, shareFolder, filePath);
SmbFile smbFile = new SmbFile(url);
smbFile.connect();
FileUtil.initfloderPath(localDir);
String localFilePath = localDir + "/" + smbFile.getName();
BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(smbFile));
FileUtil.writeFile(localFilePath, FileUtil.convertStreamToByte(buf));
}
public static void downloadFileByAuth(String ip, String shareFolder, String userName, String password, String filePath, String localDir) throws Exception {
System.setProperty("jcifs.smb.client.dfs.disabled", "true");
String url = getFileUrl(ip, shareFolder, filePath);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(ip, userName, password);
SmbFile smbFile = new SmbFile(url, auth);
smbFile.connect();
FileUtil.initfloderPath(localDir);
String localFilePath = localDir + "/" + smbFile.getName();
BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(smbFile));
FileUtil.writeFile(localFilePath, FileUtil.convertStreamToByte(buf));
}
public static String getFileUrl(String ip, String shareFolder, String filePath) {
return "smb://" + ip + "/" + shareFolder + "/" + filePath;
}SMB2.0
集成smbj類庫,適用于windows server2012及以上操作系統(tǒng),默認(rèn)安裝開啟無需額外配置
此類庫maven引用很久沒有發(fā)布最新版本,需要下載代碼自行編譯,github地址:https://github.com/hierynomus/smbj
經(jīng)測(cè)試,500MB文件傳輸大概比minio協(xié)議傳輸快了4秒左右,小文件傳輸速度基本保持一致
public static void downloadFileV2(String ip, String shareFolder, String filePath, String localDir) throws Exception {
SMBClient client = new SMBClient(SmbConfig.createDefaultConfig());
Connection conn = client.connect(ip);
Session session = conn.authenticate(AuthenticationContext.anonymous());
downLoadSMB2(session, shareFolder, filePath, localDir);
}
public static void downloadFileByAuthV2(String ip, String shareFolder, String userName, String password, String filePath, String localDir) throws Exception {
SMBClient client = new SMBClient(SmbConfig.createDefaultConfig());
Connection conn = client.connect(ip);
Session session = conn.authenticate(new AuthenticationContext(userName, password.toCharArray(), ip));
downLoadSMB2(session, shareFolder, filePath, localDir);
}
private static void downLoadSMB2(Session session, String shareFolder, String filePath, String localDir) throws Exception {
InputStream fis = null;
FileOutputStream os = null;
DiskShare diskShare = null;
try {
diskShare = (DiskShare) session.connectShare(shareFolder);
if (!diskShare.fileExists(filePath)) {
throw new FileNotFoundException(filePath);
}
if (!diskShare.isConnected())
diskShare = (DiskShare) session.connectShare(shareFolder);
com.hierynomus.smbj.share.File file = diskShare.openFile(filePath,
EnumSet.of(AccessMask.GENERIC_READ),
(Set) null,
SMB2ShareAccess.ALL,
SMB2CreateDisposition.FILE_OPEN,
(Set) null
);
fis = file.getInputStream();
FileUtil.initfloderPath(localDir);
String[] filePathList = filePath.split("\\/");
String localFilePath = localDir + "/" + filePathList[filePathList.length - 1];
os = new FileOutputStream(localFilePath);
byte[] b = new byte[4096];
int length;
while ((length = fis.read(b)) > 0) {
os.write(b, 0, length);
}
} catch (IOException e) {
throw e;
} finally {
IOUtils.close(os);
IOUtils.close(fis);
if (diskShare != null && diskShare.isConnected()) diskShare.close();
}
}
445端口被禁用解決辦法
一般企業(yè)/政府項(xiàng)目為了系統(tǒng)安全會(huì)禁用445端口,而445端口禁用后文件共享功能無法使用,此時(shí)我們需要進(jìn)行端口轉(zhuǎn)發(fā),即將客戶端445端口轉(zhuǎn)發(fā)到共享服務(wù)器端口A,共享服務(wù)器將本地端口A轉(zhuǎn)發(fā)到445即可完成共享,具體操作步驟如下,192.168.1.164就是共享文件服務(wù)器的內(nèi)網(wǎng)ip
查看服務(wù)器轉(zhuǎn)發(fā)規(guī)則
netsh interface portproxy show all
刪除服務(wù)器轉(zhuǎn)發(fā)規(guī)則
netsh interface portproxy reset
共享文件服務(wù)器
- 執(zhí)行CMD代碼
netsh interface portproxy add v4tov4 listenport=4455 listenaddress=192.168.1.164 connectport=445 connectaddress=127.0.0.1 netsh interface portproxy add v4tov4 listenport=4455 listenaddress=127.0.0.1 connectport=445 connectaddress=127.0.0.1
客戶端服務(wù)器
- 關(guān)閉Server服務(wù)
- CMD執(zhí)行代碼
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=445 connectaddress=192.168.1.164 connectport=4455
- 重啟系統(tǒng)
到此這篇關(guān)于SpringBoot訪問windows共享文件的文章就介紹到這了,更多相關(guān)SpringBoot訪問windows共享文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之圖(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
本文章主要講解學(xué)習(xí)如何使用JAVA語言以鄰接表的方式實(shí)現(xiàn)了數(shù)據(jù)結(jié)構(gòu)---圖(Graph)。對(duì)java數(shù)據(jù)結(jié)構(gòu)之圖相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2017-04-04
SpringBoot實(shí)現(xiàn)接口防刷的五種方案
接口防刷是保障系統(tǒng)安全與穩(wěn)定性的重要措施,惡意的高頻請(qǐng)求不僅會(huì)消耗服務(wù)器資源,還可能導(dǎo)致數(shù)據(jù)異常,甚至系統(tǒng)癱瘓,本文將介紹在SpringBoot框架下實(shí)現(xiàn)接口防刷的5種技術(shù)方案,需要的朋友可以參考下2025-04-04
Springboot單體架構(gòu)http請(qǐng)求轉(zhuǎn)換https請(qǐng)求來支持微信小程序調(diào)用接口
這篇文章主要介紹了Springboot單體架構(gòu)http請(qǐng)求轉(zhuǎn)換https請(qǐng)求來支持微信小程序調(diào)用接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法
這篇文章主要介紹了SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Spring?Boot?內(nèi)置工具類ReflectionUtils的實(shí)現(xiàn)
ReflectionUtils是一個(gè)反射工具類,它封裝了Java反射的操作,使得我們能夠更輕松地操作和訪問類的方法、字段,本文主要介紹了Spring?Boot?內(nèi)置工具類ReflectionUtils的實(shí)現(xiàn),感興趣的可以了解一下2023-11-11
使用Java手搓一個(gè)控制臺(tái)進(jìn)度條打印工具
這篇文章主要為大家詳細(xì)介紹了如何使用Java手搓一個(gè)控制臺(tái)進(jìn)度條打印工具,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過程圖解
這篇文章主要介紹了基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

