smbclient java,Java使用SMBJ包从仅支持SMB2/SMB3协议的共享文件夹下载文件

说明

之前整理了一篇jcifs不能用于SMB2/SMB3机器的解决方式,其中提到了将jcifs包替换为smbj的方式解决,给出的下载的demo中虽然可以正常列出共享文件夹中的文件,但是具体怎样将共享文件夹中的文件下载到本地并没有详细说明,现在将下载代码贴出,因为github上的jar包没有给出API文档,现在的代码只是看源文件找到的一种可行的下载方式,其中的部分参数等有时间再一并进行整理,如果有更好的下载方式欢迎留言

代码

package com.smb1.utils;

import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.util.EnumSet;

import java.util.concurrent.TimeUnit;

import com.hierynomus.msdtyp.AccessMask;

import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation;

import com.hierynomus.mssmb2.SMB2CreateDisposition;

import com.hierynomus.mssmb2.SMB2ShareAccess;

import com.hierynomus.smbj.SMBClient;

import com.hierynomus.smbj.SmbConfig;

import com.hierynomus.smbj.auth.AuthenticationContext;

import com.hierynomus.smbj.connection.Connection;

import com.hierynomus.smbj.session.Session;

import com.hierynomus.smbj.share.DiskShare;

import com.hierynomus.smbj.share.File;

/**

* SMB2连接示例

* 例: 我们当前要连接 IP为:123.123.123.123 目录为: SRC/SMB2/ 下的文件

* @author liuyb

*

*/

public class SMB2Connect {

private static final String SHARE_DOMAIN = "计算机域名";

private static final String SHARE_USER = "共享文件设置的账户";

private static final String SHARE_PASSWORD = "共享文件设置的密码";

private static final String SHARE_SRC_DIR = "SRC/";

private static final String SHARE_DST_DIR = "SMB2/";

public static void main(String[] args) {

// 设置超时时间(可选)

SmbConfig config = SmbConfig.builder().withTimeout(120, TimeUnit.SECONDS)

.withTimeout(120, TimeUnit.SECONDS) // 超时设置读,写和Transact超时(默认为60秒)

.withSoTimeout(180, TimeUnit.SECONDS) // Socket超时(默认为0秒)

.build();

// 如果不设置超时时间SMBClient client = new SMBClient();

SMBClient client = new SMBClient(config);

try {

Connection connection = client.connect("IP或域名");// 如:123.123.123.123

AuthenticationContext ac = new AuthenticationContext(SHARE_USER, SHARE_PASSWORD.toCharArray(), SHARE_DOMAIN);

Session session = connection.authenticate(ac);

// 连接共享文件夹

DiskShare share = (DiskShare) session.connectShare(SHARE_SRC_DIR);

String folder = SHARE_SRC_DIR + SHARE_DST_DIR;

String dstRoot = "要保存的本地文件夹路径";// 如: D:/smd2/

for (FileIdBothDirectoryInformation f : share.list(SHARE_DST_DIR, "*.mp4")) {

String filePath = folder + f.getFileName();

String dstPath = dstRoot + f.getFileName();

FileOutputStream fos = new FileOutputStream(dstPath);

BufferedOutputStream bos = new BufferedOutputStream(fos);

if (share.fileExists(filePath)) {

System.out.println("正在下载文件:" + f.getFileName());

File smbFileRead = share.openFile(filePath, EnumSet.of(AccessMask.GENERIC_READ), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);

InputStream in = smbFileRead.getInputStream();

byte[] buffer = new byte[4096];

int len = 0;

while ((len = in.read(buffer, 0, buffer.length)) != -1) {

bos.write(buffer, 0, len);

}

bos.flush();

bos.close();

System.out.println("文件下载成功");

System.out.println("==========================");

} else {

System.out.println("文件不存在");

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (client != null) {

client.close();

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值