【问题标题】:file uploading successfully, but 0kb file is uploading on remote server using jsch sftp java文件上传成功,但 0kb 文件正在使用 jsch sftp java 在远程服务器上上传
【发布时间】:2015-07-17 06:49:04
【问题描述】:

我正在使用 Jsch 和 Sftp 协议在一个简单的 Java 应用程序中将文件从本地计算机上传到远程服务器。

我的代码没有出现错误或异常,并且运行成功,但是当我查看远程位置时,文件被上传为 0kb,没有扩展名并命名为“D”。

我尝试了很多方法,但我无法找出错误。

这是我的代码..

        String remoteDirectory = "D:\\Datastores\\RootStore\\Test\\";
        String localDirectory = "C:\\pdffiles\\";


        String fileToFTP = "demo.pdf";
        String SFTPHOST = "hostIPaddress";
        int SFTPPORT = 22;
        String SFTPUSER = "username";
        String SFTPPASS = "password";


        String local_filename = fileToFTP;
        String local_pathname = localDirectory;
        String remote_filename = fileToFTP;


        JSch jsch = null;
        Session session = null;
        ChannelSftp sftpChannel = null;


        try
        {
          jsch = new JSch();
          session = jsch.getSession(SFTPUSER, SFTPHOST);
          session.setPassword(SFTPPASS);
          session.setPort(SFTPPORT);
          session.setConfig("StrictHostKeyChecking", "no");
          session.setConfig("cipher.s2c", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
          session.setConfig("cipher.c2s", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
          session.connect();

          sftpChannel = (ChannelSftp)session.openChannel("sftp");
          sftpChannel.connect();

          System.out.println(sftpChannel);
          System.out.println(sftpChannel.getSession().isConnected());

          FileInputStream fileBodyIns = new FileInputStream(local_pathname + local_filename);

          System.out.println(local_pathname + local_filename);
          System.out.println(remoteDirectory + remote_filename);

          sftpChannel.put(fileBodyIns, remoteDirectory + remote_filename);
          fileBodyIns.close();

          sftpChannel.exit();
          session.disconnect();

          System.out.println("File uploaded successfully");
          return "File uploaded successfully";
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return e.getMessage();
        }

我的连接成功,线路

System.out.println(sftpChannel.getSession().isConnected());

给出真实

下面一行打印成功

System.out.println("File uploaded successfully");

【问题讨论】:

标签: java file upload sftp jsch


【解决方案1】:

我同意肯斯特的回答。我在远程 Windows 机器上遇到了类似的问题,而 linux 风格的路径解决了我的问题。只是想补充一下,ChannelSftp 的根目录是远程 Windows 机器上的 C:\ 磁盘,我不确定有没有办法将文件放在 D:\ 磁盘上。

【讨论】:

    【解决方案2】:
    String remoteDirectory = "D:\\Datastores\\RootStore\\Test\\";
    

    SFTP 协议对远程服务器上的文件路径名使用类似 unix 的命名方案。文件分隔符是“/”,没有前导“/”的路径名被认为是相对于当前目录的。冒号和反斜杠没有特殊含义。

    根据这些规则,您要求远程服务器在您的主目录中创建一个名为“D:\DataStores...”的文件,其中包含文字冒号和反斜杠。如果您的远程服务器是 Cygwin OpenSSH 服务器或基于 Unix 的服务器的某个其他端口,则 SFTP 服务器解释文件名的方式与 Windows 操作系统解释文件名的方式可能不匹配。

    您需要找出正确的语法来引用 D: 驱动器上通过此 SFTP 服务器的路径。如果是 Cygwin SFTP 服务器,我认为正确的语法是“/cygdrive/d/Datastores/RootStore/Test/...”。如果 SFTP 服务器由其他供应商提供,您可能需要查阅服务器文档。或者,您可以尝试以交互方式登录 SFTP 服务器,cd 到“/”目录,然后从那里进行探索。如何引用 D 盘上的文件夹应该很明显了。

    【讨论】:

    • 我的服务器是基于 Windows 的,所以我认为这条路径不会有问题,如果路径有问题,它会给我一个错误,例如 - '3 Permission denied'在 Windows 中,因为我的用户只有该目录的写入权限,并且它试图写入其他目录。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2015-07-18
    • 2016-01-28
    • 2013-04-23
    相关资源
    最近更新 更多