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();
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/u013092293/article/details/83958491