首页IT科技访问springboot项目(SpringBoot访问windows共享文件)

访问springboot项目(SpringBoot访问windows共享文件)

时间2025-06-20 19:36:48分类IT科技浏览7430
导读:前言 最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用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 重启系统

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python名称中的下划线(python命名关键字参数的使用注意)