这是我用来通过SFTP发送文件的代码:
private void send (String sftpHost, int sftpPort, String user, String sshPrivateKeyPath, String sshPassphrase, String sftpDir, String fileName) {
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
FileInputStream fis = null;
try {
JSch jsch = new JSch();
jsch.addIdentity(sshPrivateKeyPath, sshPassphrase);
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(sftpDir);
File f = new File(fileName);
fis = new FileInputStream(f);
channelSftp.put(fis, f.getName(), ChannelSftp.OVERWRITE);
} catch (Exception ex) {
logger.error("sending file failed", ex);
throw new RuntimeException(ex);
}
finally{
try {
if(fis != null) fis.close();
} catch (IOException e) {
logger.error("Error closing stream", e);
}
if(channelSftp != null) channelSftp.exit();
if(channel != null) channel.disconnect();
if(session != null) session.disconnect();
}
}
两台机器都是CentOS 6.5虚拟机,java 1.7.0_51,OpenJDK,tomcat 7.0.50
使用unzip -Z在源/客户端服务器上运行zip。在目标/服务器上,我收到此错误:
Archive: filename.zip
[filename.zip]
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
zipinfo: cannot find zipfile directory in one of filename.zip or
filename.zip.zip, and cannot find filename.zip.ZIP, period.
文件大小也已更改:
来源(确定)
-rw-r--r--. 1 root root 49170 Oct 10 15:35 filename.zip
Detination(已损坏)
-rw-rw-r--. 1 user user 45710 Oct 10 15:35 filename.zip
我还尝试在损坏的文件上运行jar -tf并得到:
java.util.zip.ZipException: error in opening zip file
但是当我尝试jar xvf时,它成功地提取了文件。所以它并非完全“腐败”
我也试过通过WinSCP转移到我的Windows 7机器并尝试7zip,但它也无法打开文件。
我在想,也许Jsch有二进制文件的设置,但我还没找到。
感谢您提供的任何帮助/指示
更新1:我也尝试过Jsch的SCP界面,结果相同
更新2:我尝试过sshj sftp并获得相同的结果。所以不是一个jsch问题...
更新3:我也尝试添加以下代码。虽然文件大小已更改,但仍无法使用unzip -Z
打开config.put("compression.s2c", "none");
config.put("compression.c2s", "none");
config.put("compression_level", "0");
答案 0 :(得分:0)
这都是由于我的愚蠢造成的。用于创建此代码使用的zip的zipoutstream尚未关闭,即zip创建和文件发送在同一个try-catch-finally块中。很抱歉浪费任何人的时间。