SpringBoot访问windows共享文件(springboot启动后如何访问)

  本篇文章为你整理了SpringBoot访问windows共享文件(springboot启动后如何访问)的详细内容,包含有springboot配置访问本地文件 springboot启动后如何访问 访问springboot项目 springboot局域网访问 SpringBoot访问windows共享文件,希望能帮助你了解 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

 

  

 

  以上就是SpringBoot访问windows共享文件(springboot启动后如何访问)的详细内容,想要了解更多 SpringBoot访问windows共享文件的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: