说明
之前整理了一篇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();
}
}
}
}