如何在不进行URL解码的情况下将文件上传到SFTP

问题描述 投票:0回答:1
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 预先感谢。

java spring-boot file-upload sftp spring-integration-sftp
1个回答
0
投票

确保在 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);

如果没有功能,请先将本地信息发送给特使,然后在转移后以原产地名称恢复。 我的服务器上的问题可能会自动解码我的特殊字符。如果您不控制行为,请临时调整解决方案,简单而有效。

© www.soinside.com 2019 - 2024. All rights reserved.