gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:40 24 4
gpt4 key购买 nike

我有一个 SFTP 问题(带有 WinSSHD 的 Windows)。我尝试用 Apache Commons VFS 在文件夹中写一个文件。在本地 SFTP 上,我的上传没有问题,但在第二个 SFTP 上,我总是收到以下错误。

FTP 看起来像这样: enter image description here

我需要上传到文件夹“alis”。奇怪的是它没有用户/组和770权限。但是,使用 FileZilla 文件上传工作正常(使用相同的登录名)。

在文件夹“alis”上执行“manager.resolveFile()”(我尝试上传到此文件夹)并打印“.getType()”,我得到的信息是"file"而不是预期的“文件夹” .

有谁知道为什么 VFS 确实将文件夹识别为文件或者为什么上传不起作用?

上传文件到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

源代码:(要运行您需要“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;
}
}

最佳答案

我们使用了另一种方式来连接和上传文件到一些 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();
}
}

这种方法应该适用于任何 SSH (SFTP),并且不要求任何登录信息或其他阻止内容。

关于java - 文件上传到 SFTP 失败(Apache VFS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19809931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com