SpringBoot访问windows共享文件的方法
作者:code2roc 时间:2023-11-08 13:37:13
前言
最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共享功能进行文件传输
SMB1.0
集成jcifs类库,主要适用于一些老旧系统,但下载速度比较慢,仅作参考
此类库没有maven引用,官网地址:http://jcifs.samba.org/
注意事项:
设置jcifs.smb.client.dfs.disabled选项开启,可以提高传输速度
使用NtlmPasswordAuthentication认证代替smb协议url携带用户名密码方式,避免特殊字符传递造成认证失败
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及以上操作系统,默认安装开启无需额外配置
此类库maven引用很久没有发布最新版本,需要下载代码自行编译,github地址:https://github.com/hierynomus/smbj
经测试,500MB文件传输大概比minio协议传输快了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端口被禁用解决办法
一般企业/政府项目为了系统安全会禁用445端口,而445端口禁用后文件共享功能无法使用,此时我们需要进行端口转发,即将客户端445端口转发到共享服务器端口A,共享服务器将本地端口A转发到445即可完成共享,具体操作步骤如下,192.168.1.164就是共享文件服务器的内网ip
查看服务器转发规则
netsh interface portproxy show all
删除服务器转发规则
netsh interface portproxy reset
共享文件服务器
执行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
客户端服务器
关闭Server服务
CMD执行代码
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=445 connectaddress=192.168.1.164 connectport=4455
重启系统
来源:https://www.cnblogs.com/yanpeng19940119/archive/2023/02/05/17093476.html
标签:SpringBoot,windows,共享文件
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Flutter 实现网易云音乐字幕的代码
2023-04-01 11:50:45
![](https://img.aspxhome.com/file/2023/4/138084_0s.gif)
Android在JNI中使用ByteBuffer的方法
2021-11-08 21:14:35
Android使用自定义属性实现图片自动播放滚动的功能
2023-04-13 18:51:49
Android 添加TextView删除线(代码简单)
2022-05-27 16:48:47
![](https://img.aspxhome.com/file/2023/3/109213_0s.png)
Spring及Mybatis整合占位符解析失败问题解决
2022-08-13 06:42:49
点击图标进入指定浏览器将首页设置全透明解决一闪而过问题
2023-05-11 23:43:48
java基础之接口组成更新的实现
2022-10-03 08:10:27
Java发送报文与接收报文的实例代码
2023-07-09 04:44:01
c# 如何实现图片压缩
2022-02-10 00:46:31
.NET中的Timer类型用法详解
2022-12-15 18:33:23
![](https://img.aspxhome.com/file/2023/8/83258_0s.png)
Java泛型中<?>和<T>的区别浅析
2023-11-25 05:20:09
java生成json数据示例
2023-10-30 04:06:45
![](https://img.aspxhome.com/file/2023/9/64059_0s.jpg)
举例分析Python中设计模式之外观模式的运用
2021-11-24 01:54:48
springcloud feign调其他微服务时参数是对象的问题
2023-01-23 06:24:04
深入探讨JAVA中的异常与错误处理
2023-06-11 00:30:24
IntelliJ IDEA中查看文件内所有已声明的方法(类似eclipse的outline)
2021-08-06 00:39:39
![](https://img.aspxhome.com/file/2023/7/62147_0s.png)
深入学习Java单元测试(Junit+Mock+代码覆盖率)
2021-06-17 00:39:13
Java基于Tcp协议的socket编程实例
2022-03-08 00:04:13
Android控件设置宽高比的方法
2023-02-14 09:30:04
Android小工具自定义view课表
2023-02-12 14:51:41
![](https://img.aspxhome.com/file/2023/7/138677_0s.jpg)