返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot访问windows共享文件的方法
  • 706
分享到

SpringBoot访问windows共享文件的方法

SpringBoot访问windows共享文件SpringBoot访问共享文件 2023-02-06 09:02:31 706人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言SMB1.0SMB2.0445端口被禁用解决办法前言 最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用miNIO存储且不在同一台服务器上,为了优化速度决定使用

前言

最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用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
  • 重启系统

到此这篇关于SpringBoot访问windows共享文件的文章就介绍到这了,更多相关springBoot访问windows共享文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot访问windows共享文件的方法

本文链接: https://lsjlt.com/news/194269.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作