使用JSch库上传重试机制

时间:2017-11-20 12:26:48

标签: java coldfusion sftp jsch

我有一个要上传的文件(例如abc.pdf)。我第一次想要将此文件作为临时文件上传(例如abc.pdf.temp)。然后,如果文件成功传输(完全传输),那么我需要将其重命名为其原始名称(abc.pdf)。但是如果文件没有完全转移,那么我需要删除我最初上传的临时文件,因为我不想在服务器中保留损坏的文件。使用此JSch库是否可以实现。下面是示例代码。这个代码是否有意义实现这一点?

示例代码:

originalFile = 'abc.pdf';
tempFile = 'abc.pdf.temp';
fileInputStream = createobject("java", "java.io.FileInputStream").init('C:\abc.pdf'); 
SftpChannel.put(fileInputStream,tempFile);

// Comparing remote file size with local file
if(SftpChannel.lstat(tempFile).getSize() NEQ localFileSize){
    // Allow to Resume the file transfer since the file size is different
    SftpChannel.put(fileInputStream,tempFile,SftpChannel.RESUME); 
    if(SftpChannel.lstat(tempFile).getSize() NEQ localFileSize){
       // Check again if the file is not fully transferred (During RESUME) then
       // deleting the file since dont want to keep a corrupted file in the server.
       SftpChannel.rm(tempFile);
    }
}else{//assuming file is fully transferred
    SftpChannel.rename(tempFile ,originalFile);
}

1 个答案:

答案 0 :(得分:0)

  1. put完成而不投掷之后,文件大小不会匹配,这是不太可能的。它很难发生。即使它发生了,呼叫RESUME也没有意义。如果put未检测到某些灾难性问题,则RESUME可能无法提供帮助。

    即使您想尝试RESUME,尝试一次也没有意义。如果你认为重试是有意义的,你必须继续重试,直到你成功,而不仅仅是一次。

  2. 您应该捕获异常并恢复/删除/无论如何。这是主要的恢复机制。这比1发生的可能性高100倍。