Java SFTP(Apache VFS2)-带有@的密码

5
我正在尝试使用org.apache.commons.vfs2通过SFTP下载文件。问题是,密码中包含“@”字符,这导致URI被错误解析:
org.apache.commons.vfs2.FileSystemException: Expecting / to follow the hostname in URI

有没有人知道如何解决这个问题?(很显然我无法更改密码)。这是我正在使用的代码:

String sftpUri = "sftp://" + userName + ":" + password + "@"
        + remoteServerAddress + "/" + remoteDirectory + fileName;

String filepath = localDirectory + fileName;
File file = new File(filepath);
FileObject localFile = manager.resolveFile(file.getAbsolutePath());

FileObject remoteFile = manager.resolveFile(sftpUri, opts);
localFile.copyFrom(remoteFile, Selectors.SELECT_SELF);

请再次查看您的sftpUri。如果您的密码包含@符号,remoteServerAddress参数会发生什么变化? - Hannes
就像我说的那样,我知道问题出在哪里(URI由于密码中的@符号而被解析错误)。我的问题是如何解决它。 - Ayelet
1
抱歉,我没看到。请查看https://dev59.com/Rmw15IYBdhLWcg3wSJo3。 - Hannes
这可能是一个愚蠢的问题,但如何对密码进行编码? - Ayelet
你可以使用java.net中的URLEncoder.encode(...)。只对用户名和密码进行编码。 - Hannes
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6

使用实际的URI构造函数而不是手动编写:

String userInfo = userName + ":" + password;
String path = remoteDirectory + filename;  // Need a '/' between them?
URI sftpUri = new URI("sftp", userInfo, remoteServerAddress, -1, path, null, null);
...
FileObject remoteFile = manager.resolveFile(sftpUri.toString(), opts);

请确保路径以 / 开头,不要使用 Windows 的 \ 字符。或者您可以像这样从文件中转换它:new File("c:\\temp").toURI().getPath() - eckes

0

你需要通过UriParser.encode()编码你的密码,你可以像下面这样修改你的代码:

你的代码:

String sftpUri = "sftp://" + userName + ":" + password + "@"
        + remoteServerAddress + "/" + remoteDirectory + fileName;

更改为:

String sftpUri = "sftp://" + userName + ":" + **UriParser.encode(password, "@".toCharArray())**+ "@"
        + remoteServerAddress + "/" + remoteDirectory + fileName;

希望它有所帮助,谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,