SpringBoot访问windows共享文件的方法
作者:code2roc 发布时间:2023-11-08 13:37:13
标签:SpringBoot,windows,共享文件
前言
最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用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
0
投稿
猜你喜欢
- 前言Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本。Java8吸收其他语言的精髓带来了函数式编程,lambd
- 本文实例为大家分享了Android TextView实现跑马灯效果的具体代码,供大家参考,具体内容如下当Layout中只有一个TextVie
- 1. SpEL 回顾经过上篇文章的学习,小伙伴们已经知道了,在 Spring Security 中,@PreAuthorize、@PostA
- 1、什么是servlet异步请求Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:(1)、Servlet 接收
- Android植物大战僵尸小游戏全部内容如下:相关下载:Android植物大战僵尸小游戏具体代码如下所示:package com.examp
- 效果展示人脸支付效果视频密码框输入支付效果视频因为密码支付时会调起系统安全键盘,开启自动保护功能,防止泄露,会导致输入密码时录屏黑屏,故使用
- 上帝之火本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼。每次我都能联想到带来上帝之火的希腊之神,普罗米修斯。而这
- C#串口模块的使用。使用VS .net框架下WinForm程序应用开发。C#开发的串口通信小工具。相比于QT添加的串口类,WinForm是通
- 话不多说,请看代码:<!DOCTYPE html><html><head> <meta
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 1 前言任何一门语言都需要基本的流程控制语句,其思想也符合人类判断问题或做事的逻辑过程。什么是流程控制呢?流程就是做一件事情的顺序,或者说是
- 前几天网上突然出现流言:某东发生数据泄露12G,最终某东在一篇声明中没有否认,还算是勉强承认了吧,这件事对于一般人有什么影响、应该怎么做已经
- 前言二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;frea
- maven配置项目的jdk版本无效排查最近在配置项目的jdk的时候发现在pom.xml中配置的1.8版本无效,maven更新后就变成了1.7
- 1.ArrayList 是基数组结构的,需要连续的内存空间从构造函数可以看出,ArrayList内部用一个Object数组来保存数据。对于无
- 记录一下微信第三方实现登录的方法。还是比较简单。一、必要的准备工作1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需
- 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或0
- Google 发布的Material Design支持库,对我们的APP设计有很大的影响,如果重新设计APP,支持库应该直接用V4提升到V7
- 采用继承Thead类实现多线程:优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread(
- Android 中ScrollView嵌套GridView,ListView的实例在Android开发中,经常有一些UI需要进行固定styl