android smbclient教程,Accessing SMB2.1 or SMB3 share from java?

本文介绍使用hierynomus/smbj库实现SMB2协议文件上传的过程,包括配置SMB客户端、认证连接及创建文件等内容,并解决了依赖缺失的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Expanding on @Breakidi answer, I've just used hierynomus/smbj v0.2.0 on Android and added SMB2 support. It claims support for both SMB2 and SMB3 although classes reference only SMB2 versions, not sure, maybe it is irrelevant.

Testing

I've tested it against box running SMB2 open in one case and then both SMB2 and SMB3 open in another. I could not disable SMB2 and test SMB3 alone though.

Bouncycastle/Spongycastle

There was a need to use Spongycastle in my case (most likely because of Android) as required MD4 dependency was missing from classpath. I've used it within my class that connects to SMB: import org.spongycastle.jce.provider.BouncyCastleProvider; import java.security.Security; static { Security.addProvider(new BouncyCastleProvider()); }

Uploading file

Make sure you set correct flags when call openFile on a DiskShare (by looking into source code off course): // required imports import com.hierynomus.msdtyp.AccessMask; import com.hierynomus.msfscc.FileAttributes; import com.hierynomus.mssmb2.SMB2CreateDisposition; import com.hierynomus.mssmb2.SMB2CreateOptions; 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.common.SMBApiException; import com.hierynomus.smbj.connection.Connection; import com.hierynomus.smbj.session.Session; import com.hierynomus.smbj.share.DiskShare; import com.hierynomus.smbj.share.File; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.HashSet; ... // connection params String sambaDomain = null; // can be null String sambaUsername = "iamuploader"; String sambaPass = "mysecret"; String sambaIP = "192.168.1.236"; String sambaSharedPath = "sharedfolder"; ... // upload method // usage: upload("file/whithin/folder.txt", fileBytes); public void upload(String filename, byte[] bytes) throws IOException { SmbConfig cfg = SmbConfig.builder().build(); SMBClient client = new SMBClient(cfg); Connection connection = client.connect(sambaIP); Session session = connection.authenticate(new AuthenticationContext(sambaUsername, sambaPass.toCharArray(), sambaDomain)); DiskShare share = (DiskShare) session.connectShare(sambaSharedPath); // this is com.hierynomus.smbj.share.File ! File f = null; int idx = filename.lastIndexOf("/"); // if file is in folder(s), create them first if(idx > -1) { String folder = filename.substring(0, idx); try { if(!share.folderExists(folder)) share.mkdir(folder); } catch (SMBApiException ex) { throw new IOException(ex); } } // I am creating file with flag FILE_CREATE, which will throw if file exists already if(!share.fileExists(filename)){ f = share.openFile(filename, new HashSet(Arrays.asList(AccessMask.GENERIC_ALL)), new HashSet(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)), SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_CREATE, new HashSet(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE)) ); } if(f == null) return null; OutputStream os = f.getOutputStream(); os.write(bytes); os.close(); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值