简体   繁体   English

文件上传到SFTP失败(Apache VFS)

[英]File upload to SFTP fails (Apache VFS)

I have a problem with a SFTP (Windows with WinSSHD ). 我有一个SFTP(Windows与WinSSHD )的问题。 I try to write a file in a folder with Apache Commons VFS . 我尝试用Apache Commons VFS在一个文件夹中写一个文件。 On a local SFTP I have no problem with the upload but on a second SFTP I always get the error below. 在本地SFTP上我没有上传的问题但在第二个SFTP上我总是得到以下错误。

The FTP looks like this: FTP看起来像这样: 在此输入图像描述

I need to upload into the folder "alis". 我需要上传到文件夹“alis”。 What is strange is that it has no User/Group and 770 rights. 奇怪的是它没有User / Group和770权限。 However, with FileZilla the file upload works fine (same login used). 但是,使用FileZilla文件上传工作正常(使用相同的登录)。

Doing a "manager.resolveFile()" on the Folder "alis" (i try to upload to this folder) and printing the ".getType()" i get the information "File" and not as expected "Folder". 在文件夹“alis”上执行“manager.resolveFile()”(我尝试上传到此文件夹)并打印“.getType()”我获取信息“文件”而不是预期的“文件夹”。

Does anyone have an idea why VFS does recognize the folder as file or why the upload does not work? 有没有人知道为什么VFS会将文件夹识别为文件或为什么上传不起作用?

The exception when uploading the file to the SFTP: 将文件上载到SFTP时的例外情况:

Exception in thread "main" java.lang.RuntimeException: org.apache.commons.vfs2.FileSystemException: Could not copy "file:///D:/Test/test.txt" to "sftp://user:***@host/.../alis/test.txt".
    at test.Test.upload(Test.java:77)
    at test.Test.main(Test.java:22)
Caused by: org.apache.commons.vfs2.FileSystemException: Could not copy "file:///D:/Test/test.txt" to "sftp://user:***@host/.../alis/test.txt".
    at org.apache.commons.vfs2.provider.AbstractFileObject.copyFrom(AbstractFileObject.java:1062)
    at test.Test.upload(Test.java:73)
    ... 1 more
Caused by: org.apache.commons.vfs2.FileSystemException: Could not create folder "sftp://user:***@host/.../alis" because it already exists and is a file.
    at org.apache.commons.vfs2.provider.AbstractFileObject.createFolder(AbstractFileObject.java:968)
    at org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1424)
    at org.apache.commons.vfs2.provider.DefaultFileContent.getOutputStream(DefaultFileContent.java:461)
    at org.apache.commons.vfs2.provider.DefaultFileContent.getOutputStream(DefaultFileContent.java:441)
    at org.apache.commons.vfs2.FileUtil.copyContent(FileUtil.java:111)
    at org.apache.commons.vfs2.provider.AbstractFileObject.copyFrom(AbstractFileObject.java:1053)
    ... 2 more

Sourcecode: (to run the example you need "jsch-0.1.50.jar") 源代码:(运行示例,您需要“jsch-0.1.50.jar”)

import java.io.File;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.Selectors;
import org.apache.commons.vfs2.impl.StandardFileSystemManager;
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder;

/**
 *
 * @author thbe
 */
public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        upload("host", "user", "password", "D:/Test/test.txt", "/../alis/test.txt");
    }

    public static FileSystemOptions createDefaultOptions()
            throws FileSystemException {
        // Create SFTP options
        FileSystemOptions opts = new FileSystemOptions();

        // SSH Key checking
        SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
                opts, "no");

        // Root directory set to user home
        SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);

        // Timeout is count by Milliseconds
        SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);
        SftpFileSystemConfigBuilder.getInstance().setPreferredAuthentications(opts, "publickey,keyboard-interactive,password");

        return opts;
    }

    public static void upload(String hostName, String username,
            String password, String localFilePath, String remoteFilePath) {

        File f = new File(localFilePath);
        if (!f.exists()) {
            throw new RuntimeException("Error. Local file not found");
        }

        StandardFileSystemManager manager = new StandardFileSystemManager();

        try {
            manager.init();

            // Create local file object
            FileObject localFile = manager.resolveFile(f.getAbsolutePath());

            System.out.println("open remote File");
            FileObject remoteFile = manager.resolveFile(
                    createConnectionString(hostName, username, password,
                    remoteFilePath), createDefaultOptions());

            System.out.println("exists:"+remoteFile.exists());
            System.out.println("type:"+remoteFile.getType());
            System.out.println("URL:"+remoteFile.getURL());

            System.out.println("copy to remote File");
            remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);

            System.out.println("File upload success");
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            manager.close();
        }
    }

    public static String createConnectionString(String hostName,
            String username, String password, String remoteFilePath) {
        // result: "sftp://user:123456@domainname.com/resume.pdf
        return "sftp://" + username + ":" + password + "@" + hostName + "/"
                + remoteFilePath;
    }
}

We used another way to connect and upload files to some SFTP: 我们使用另一种方式将文件连接并上传到某些SFTP:

public static void main(String[] args) {
    putFile("user", "host", "passwd", "/../test.txt", "C:/test.txt");
}
public static void putFile(String username, String host, String password, String remotefile,     String localfile){
    JSch jsch = new JSch();
    Session session = null;
    try {
          session = jsch.getSession(username, host, 22);
          session.setConfig("StrictHostKeyChecking", "no");
          session.setPassword(password);
          session.connect();

          Channel channel = session.openChannel("sftp");
          channel.connect();
          ChannelSftp sftpChannel = (ChannelSftp) channel;
          sftpChannel.put(localfile, remotefile);
          sftpChannel.exit();
          session.disconnect();
     } catch (JSchException e) {
          e.printStackTrace();  
     } catch (SftpException e) {
          e.printStackTrace();
     }
}

This approach should work with any SSH (SFTP) and not ask for any login information or other blocking stuff. 此方法应适用于任何SSH(SFTP),不要求任何登录信息或其他阻止内容。

You mentioned: 你提到过:

770 rights but no user and no group.

"Other" people do not have right to use the directory. “其他”人无权使用该目录。 The directory does not have user or group, therefore your SFTP client may have failed due to insufficient permission. 该目录没有用户或组,因此您的SFTP客户端可能由于权限不足而失败。

What happens if you assign it a user/group? 如果您为其分配用户/组会发生什么?

I faced the same issue. 我遇到了同样的问题。 You are trying to creating folder in same location and file is exists in same location with same name. 您正尝试在相同位置创建文件夹,并且文件存在于同名的同一位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Apache VFS2 - 无法将文件上传到 SFTP 服务器 - Apache VFS2 - can't upload file to SFTP server Apache VFS SFTP moveTo命令失败 - Apache VFS SFTP moveTo command fails 当使用 Apache Commons VFS 进行 SFTP 上传时,必须面对 org.apache.commons.vfs2.FileSystemException:找不到带有 URI 的文件 - When SFTP Upload using Apache Commons VFS have to face org.apache.commons.vfs2.FileSystemException: Could not find file with URI 使用 Apache Commons vfs2(spring boot) 的 SFTP 文件传输失败并出现 IOException:错误 - SFTP file transfer using Apache Commons vfs2(spring boot) fails with IOException: error SFTP上传下载使用Apache Commons VFS进行存在和移动 - SFTP Upload Download Exist and Move using Apache Commons VFS Sftp 文件上传失败 - Sftp File Upload Fails Apache VFS:获取目录的最新更改文件(SFTP) - Apache vfs: fetch latest changed file of a directory (sftp) 使用Apache Commons Vfs2的SFTP文件传输 - SFTP file transfer using Apache Commons Vfs2 Android + JCraft JSch SFTP上传-“ org.apache.commons.vfs2.FileSystemException:无法在以下位置连接到SFTP服务器” - Android + JCraft JSch SFTP upload - “org.apache.commons.vfs2.FileSystemException: Could not connect to SFTP server at…” 使用apache vfs与相互身份验证进行sftp - sftp with mutual auth using apache vfs
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM