public static void main(String[] args) throws IOException {
// Local file path and remote directory
String localFile = "C:\\my\\local\\dir\\myFile%2Eto%2Fsftp%2Euploaded.zip";
String remoteDir = "/sftp/remote/dir/";
// Call method to upload file
uploadFileToSftp(localFile, remoteDir);
}
private static SSHClient setupSshj() throws IOException {
// SSH connection details
String remoteHost = "sftp.host.com";
String username = "myUsername";
String password = "myDftppassword";
SSHClient client = new SSHClient();
client.addHostKeyVerifier(new PromiscuousVerifier());
client.connect(remoteHost);
client.useCompression();
client.authPassword(username, password);
return client;
}
public static void uploadFileToSftp(String localFile, String remoteDir) throws IOException {
// Set up SSH client
SSHClient sshClient = setupSshj();
SFTPClient sftpClient = sshClient.newSFTPClient();
// Debugging: print the remote file path you're uploading to
// Upload the file with special characters in the name, without URL encoding
sftpClient.put(localFile, remoteDir);
// Close the connection
sftpClient.close();
sshClient.disconnect();
}
以下是日志:
2025-01-06 16:22:30 [main] INFO n.s.sshj.transport.random.JCERandom - - - - 创建新的 SecureRandom。 2025-01-06 16:22:30 [main] INFO n.s.sshj.transport.TransportImpl - - - - 客户端身份字符串:SSH-2.0-SSHJ_0.38.0 2025-01-06 16:22:30 [main] INFO n.s.sshj.transport.TransportImpl - - - - 服务器身份字符串:SSH-2.0-CrushFTPSSHD 2025-01-06 16:22:32 [main] INFO n.s.s.c.c.direct.SessionChannel - - - - 将请求
sftp
子系统
线程“main”中出现异常 java.io.IOException:尝试将文件 myFile%2Eto%2Fsftp%2Euploaded.zip 上传到路径 /sftp/remote/dir/myFile%2Eto%2Fsftp%2Euploaded.zip 但那是一个目录
在 net.schmizz.sshj.sftp.SFTPFileTransfer$Uploader.prepareFile(SFTPFileTransfer.java:349)
在 net.schmizz.sshj.sftp.SFTPFileTransfer$Uploader.uploadFile(SFTPFileTransfer.java:256)
在 net.schmizz.sshj.sftp.SFTPFileTransfer$Uploader.upload(SFTPFileTransfer.java:209)
在 net.schmizz.sshj.sftp.SFTPFileTransfer$Uploader.access$100(SFTPFileTransfer.java:192)
在net.schmizz.sshj.sftp.SFTPFileTransfer.upload(SFTPFileTransfer.java:81)
在net.schmizz.sshj.sftp.SFTPFileTransfer.upload(SFTPFileTransfer.java:59)
在net.schmizz.sshj.sftp.SFTPFileTransfer.upload(SFTPFileTransfer.java:53)
在net.schmizz.sshj.sftp.SFTPClient.put(SFTPClient.java:251)
我的问题:我真的想将文件上传到我的远程SFTP服务器,但服务器会自动对这些特殊字符进行URL编码并抛出上述异常。在联系我的 sftp 服务器团队之前,我只是想确认是否有我们可以从 java 端(客户端)修改的任何配置,以及是否可以满足我的要求。
我的文件名如下所示:myFile%2Eto%2Fsftp%2Euploaded.zip 但是SFTP服务器自动将其作为myFile.to/sftp.uploaded
我的期望是上传文件,因为它是 myFile%2Eto%2Fsftp%2Euploaded.zip 预先感谢。
确保在 chemin cible 中的文件编码准确无误,例如:
java
sftpClient.put(localFile, remoteDir + "myFile%2Eto%2Fsftp%2Euploaded.zip");
Configuration serveur : Si possible, désactivez le décodage automatique des noms de fichiers côté serveur SFTP.
对 nom avant l'envoi 进行明确编码:
java
String encodedFileName = URLEncoder.encode("myFile.to/sftp.uploaded.zip", StandardCharsets.UTF_8);
sftpClient.put(localFile, remoteDir + encodedFileName);
如果没有功能,请先将本地信息发送给特使,然后在转移后以原产地名称恢复。 我的服务器上的问题可能会自动解码我的特殊字符。如果您不控制行为,请临时调整解决方案,简单而有效。