我正在使用apache VFS将文件上传到sftp服务器。但是一个sftp服务器有一个限制,它的根目录没有任何权限。但是我的应用程序允许的目录是“/ ftp / abc /”。可以使用命令行访问此目录。但Apache VFS首先尝试切换到根目录“/”,由于我的情况下缺少权限而失败。
编辑:将userDirIsRoot
设置为true可防止vfs切换到根目录。但在这种情况下,我们必须指定相对于用户根目录的路径。这意味着userDirIsRoot
为真,否则您无法指定绝对路径。这听起来不对。
是否有一种简单的方法,我们可以使用它来指定绝对路径,而vfs不会尝试切换到基本文件系统的裸根目录。
答案 0 :(得分:3)
相关的源代码位于getChannel()
org.apache.commons.vfs.provider.sftp.SftpFileSystem
Boolean userDirIsRoot = SftpFileSystemConfigBuilder.getInstance().getUserDirIsRoot(getFileSystemOptions());
String workingDirectory = getRootName().getPath();
if (workingDirectory != null && (userDirIsRoot == null || !userDirIsRoot.booleanValue()))
{
try
{
channel.cd(workingDirectory);
}
catch (SftpException e)
{
throw new FileSystemException("vfs.provider.sftp/change-work-directory.error", workingDirectory);
}
}
您的案例中的问题是getUserDirIsRoot(getFileSystemOptions())
评估为真。
无论如何都要告诉Apache VFS库不要切换到root ?目录
为了不输入if语句而不调用channel.cd(workingDirectory)
,userDirIsRoot.booleanValue()应该评估为true。
根据documentation,您可以使用SftpFileSystemConfigBuilder
设置SftpFileSystem选项。
示例:
SftpFileSystemConfigBuilder
.getInstance()
.setUserDirIsRoot(options, true);