微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过apache VFS使用JCIFS访问SMB URL?

我正在尝试使用smb URL访问本地计算机上的文件夹。 我的项目是使用jar子:commons-vfs2-2.0.jar和jcifs-1.3.17.jar(以及所有其他所需的jar子)。 其中的代码是完整的:

public static void main(String[] args) throws filesystemexception { jcifs.Config.registerSmbURLHandler(); StaticUserAuthenticator auth = new StaticUserAuthenticator(<domain>,<user>,<password>); FileSystemOptions opts = new FileSystemOptions(); DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts,auth); FileSystemManager fs = VFS.getManager(); FileObject smbFile = fs.resolveFile("smb://10.0.2.2/TimeOut/"); System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime()); }

我正在接受例外情况:

线程“main”中的exceptionorg.apache.commons.vfs2.filesystemexception:无法确定文件“smb://10.0.2.2/TimeOut”的types。 org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:505)at org.apache.commons.vfs2.provider.AbstractFileObject.exists(AbstractFileObject.java:477)at com.newsway.tests.VfsTest .main(VfsTest.java:23)引起:jcifs.smb.SmbAuthException:login失败:帐户当前被禁用。 在jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390)上jcifs.smb的jcifs.smb.SmbTransport.send(SmbTransport.java:663)上的jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:546)。 SmbSession.send(SmbSession.java:218)at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)at jcifs.smb.SmbFile.connect(SmbFile (SmbFile.java:1006)上的jcifs.smb.SmbFile.open0(SmbFile.java:972)上的jcifs.smb.SmbFile.connect0(SmbFile.java:880)在jcifs.smb.SmbFileInputStream。(SmbFileInputStream.java:73)在jcifs.smb.SmbFileInputStream。(SmbFileInputStream.java:65)在jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844)在org.apache.commons。 vfs2.provider.url.UrlFileObject.doGetType(UrlFileObject.java:89)at org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:496)

据我所知,相关部分是: login失败:目前禁用的帐户。

.htaccess将域名redirect到子目录而不更改URL

Google Chrome审核caching

.htaccess:防止访问文件并阻止目录浏览

如何使用htaccessredirect所有访问者,但search引擎机器人

Node.js比Apache慢

这是尽pipe我的用户/密码/域是好的,我正在做什么是在VFS文档页面中定义的。

我错过了什么?

PHP不会在session_start()上创build$ _SESSIONvariables。

我怎样才能看到有多less个MysqL连接打开?

使用Apache mod proxy删除基本的身份validation头

将应用程序级用户名/用户标识注入到Nginx / Apache日志中

.htaccessdynamicimageurl重写

我想我知道你的问题是什么,沙盒提供商没有自动在2.0注册。 而且您还需要在解析调用中实际使用配置的认证属性(请参阅下面的修改源)。

我通常不使用认的文件系统管理器,而是动态注册我的提供程序,但是如果要使用自动检测,则需要将vfs-providers.xml添加到沙盒JAR。

这是你如何用2.0构建一个完整的工作JAR:

> git clone https://github.com/apache/commons-vfs.git -b commons-vfs2-project-2.0 vfs2.0 > cd vfs2.0 > notepad sandBoxpom.xml > notepad sandBoxsrctestjavaorgapachecommonsvfs2providersmbtestStandaloneMain.java > mvn -Pinclude-sandBox -DskipTests=true clean package dependency:tree

编辑sandBox / pom.xml时,需要确保从<version>和<parent> <version>标记删除了-SANDBox。 那么你需要添加

<resource> <directory>src/main/resources</directory> </resource>

到现有的<resources>标签(在第一个“许可证+注意”之后包含第88行)

这是使用的测试代码

package org.apache.commons.vfs2.provider.smb.test; import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.filesystemexception; import org.apache.commons.vfs2.FileSystemManager; import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.VFS; import org.apache.commons.vfs2.auth.StaticUserAuthenticator; import org.apache.commons.vfs2.impl.DefaultFileSystemConfigBuilder; public class StandaloneMain { public static void main(String[] args) throws filesystemexception { //jcifs.Config.registerSmbURLHandler(); StaticUserAuthenticator auth = new StaticUserAuthenticator("DOMAIN","user","SECRET"); FileSystemOptions opts = new FileSystemOptions(); DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts,auth); FileSystemManager fs = VFS.getManager(); if (!fs.hasProvider("smb")) throw new RuntimeException("Provider missing"); System.out.println("Connecting " + args[0] + " with " + opts); FileObject smbFile = fs.resolveFile(args[0],opts); // added opts! System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime()); } }

这是执行:

> set REP=C:UsersUSERNAME.m2repository > java -cp sandBoxtargetcommons-vfs2-sandBox-2.0.jar;^ coretargetcommons-vfs2-2.0.jar;^ %rEP%commons-loggingcommons-logging1.1.1commons-logging-1.1.1.jar;^ %rEP%jcifsjcifs.8.3jcifs-0.8.3.jar;^ sandBoxtargettest-classes org.apache.commons.vfs2.provider.smb.test.StandaloneMain smb://HOST/Users Jan 05,2015 2:40:19 PM org.apache.commons.vfs2.VfsLog info @R_23_4045@ION: Using "C:UsersUSERNAMEAppDataLocalTempvfs_cache" as temporary files store. Connecting smb://eckenfels02/Users with org.apache.commons.vfs2.FileSystemOptions@27dd2ec5 true 0

我使用不同的认证方法,它的工作原理,你可以试试看。

String url = "smb://10.0.2.2/TimeOut/"; NtlmPasswordAuthentication authen = new NtlmPasswordAuthentication(<domain>,<username>,<password>); SmbFile smbFile = new SmbFile(url,authen);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐