Error loading file in SFTP (Apache VFS)

I have a problem with SFTP (Windows with WinSSHD ). I am trying to write a file to a folder with Apache Commons VFS . On local SFTP, I have no problems loading, but on second SFTP I always get the error below.

FTP looks like this: enter image description here

I need to upload to the "alis" folder. It is strange that he does not have user / group rights and 770. However, with FileZilla, downloading files works fine (the same login is used).

Executing "manager.resolveFile ()" in the "alis" folder (I'm trying to load it into this folder) and typing ".getType ()", I get the "File" information, not the "Folder" as expected.

Does anyone have an idea why VFS recognizes the folder as a file or why the download does not work?

Exception when uploading a file to 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 

Source code: (to run the example you need "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@domai nname.com/resume.pdf return "sftp://" + username + ":" + password + "@" + hostName + "/" + remoteFilePath; } } 
+6
source share
3 answers

We used a different way to connect and upload files to 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 request any login information or other blocking materials.

+4
source

You mentioned:

 770 rights but no user and no group. 

"Other" people are not allowed to use the directory. There is no user or group in the directory, so your SFTP client may have failed due to insufficient permission.

What happens if you assign him a user / group?

0
source

I ran into the same problem. You are trying to create a folder in the same place, and the file exists in the same place with the same name.

0
source

Source: https://habr.com/ru/post/957492/


All Articles