SFTP传输/放置(Jsch)后Zip文件损坏(排序)

时间:2014-10-10 16:12:55

标签: java ssh sftp jsch

这是我用来通过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");

1 个答案:

答案 0 :(得分:0)

这都是由于我的愚蠢造成的。用于创建此代码使用的zip的zipoutstream尚未关闭,即zip创建和文件发送在同一个try-catch-finally块中。很抱歉浪费任何人的时间。