如何解决Java applet,用于在保持目录结构完整的同时上载文件和文件夹
|| 以下代码用于将文件和文件夹上载到服务器(SFTP)。我试图保持文件夹结构完整,即C:\\ temp \\ test \\ file.txt在服务器上变为/home/www/javauploads/temp/test/file.txt。但是当我运行它时,文件全部上传,但文件夹和文件只是完全没有任何结构地转储到服务器上,文件名看起来像这样(C3NXXV〜9)有一种方法可以上传文件和文件夹,同时保持结构和文件名完整无缺,谢谢。 ` private static void processDir(File dir) throws JSchException,SftpException {
String SFTPHOST = \"*****.com\";
int SFTPPORT = ***;
String SFTPUSER = \"****\";
String SFTPPASS = \"*****\";
String SFTPWORKINGDIR = \"/home/www/javauploads/\";`Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
session.setPassword(SFTPPASS);
java.util.Properties config = new java.util.Properties();
config.put(\"StrictHostKeyChecking\",\"no\");
session.setConfig(config);
session.connect();
channel = session.openChannel(\"sftp\");
channel.connect();
channelSftp = (ChannelSftp)channel;
channelSftp.cd(SFTPWORKINGDIR);
if (dir.isDirectory()){
channelSftp.mkdir(dir.toString());
System.out.println(\"[Directory] : \" + dir);
}else{
channelSftp.put(dir.toString());
System.out.println(\"[File] : \" + dir);
}
channelSftp.exit();
session.disconnect();
}
private static void traverse(File dir) throws JSchException,SftpException {
processDir(dir);
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
traverse(new File(dir,children[i]));
}
}
}`
解决方法
首先(与您的问题无关),您不应为每个文件或目录启动新的会话和频道-一次打开会话和频道,并将其重新用于所有文件上传。这将更快,因为每个会话打开都要进行一些往返和一些复杂的密码计算。打开频道又要往返一次。
然后,看看ChannelSftp.put(String)如何工作。它以远程文件名作为参数,并返回一个OutputStream,然后您可以在其中写入数据。您没有使用OutputStream,这意味着实际上不会发生任何上传。
我想您想要ChannelSftp.put(String,String)-这将使用本地和远程文件名,并上载本地文件的内容,创建一个远程文件(或覆盖它,如果已经存在的话)。
同样,可能存在一个问题,即dir.toString()返回本地命名约定中的文件名(即在Windows系统上用``1''分隔),而您需要用``2''分隔的文件名。我想,您可以使用简单的
.replace(\'\\\\\',\'/\')
。
但是,这并不能真正解释您的观察-您在哪个系统上使用哪个SSH服务器?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。