Jcraft 1.5 SFTP перезапись Failure ID 4 - PullRequest
0 голосов
/ 25 апреля 2018

Моя перезапись не работает и возвращает идентификатор сбоя 4. Я могу написать по этому адресу без каких-либо проблем, но когда перегрузка продолжает сбой. Когда я использую winscp с теми же кредитами, что и здесь, я могу писать и перезаписывать без проблем. Не уверен, что я понимаю, что здесь происходит с моей опцией перезаписи. Если файл находится там, а перезапись - истина, то файл с тем же именем должен быть перезаписан, но он не работает. Я использую Jcraft 1.50 и не хочу обновляться до 1.54, потому что у меня была та же проблема с этой версией, прежде чем я вернул обратно библиотеку.

//connect
try {
    session = jsch.getSession(user, host, port);
    session.setConfig("StrictHostKeyChecking", "no");
    session.setPassword( password );
    session.connect();

    Channel channel = session.openChannel( "sftp" );
    channel.connect();
    sftpChannel = (ChannelSftp) channel;

    //make sure that file does not exist or 
    //user wants to overwrite the file
    testStream = sftpChannel.get(destination);
    if (testStream != null && !overwrite) {
        throw new SftpException(ChannelSftp.SSH_FX_OP_UNSUPPORTED, "File already exists");
    }
} catch (SftpException e) {
    if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE){
        //file does not yet exist. continue.
    } else {
        resultComments = "SFTP Exception " + e.getMessage();
        status = RunResult.FAIL;
        e.printStackTrace();
    }
} catch (JSchException e) {
    resultComments = "Jsch Exception " + e.getMessage();
    status = RunResult.FAIL;
    e.printStackTrace();
}
try {
    //if file does not exist or overwrite selected, transfer file
    if (testStream == null || overwrite) {
        ByteArrayInputStream fileByteInputStream = new ByteArrayInputStream(fileByteArray);
        if (sftpChannel !=  null) {
            String workingDirectory = destination.substring(0, destination.lastIndexOf("/") + 1);
            String fileName = destination.substring(destination.lastIndexOf('/') + 1, destination.length());
            sftpChannel.cd(workingDirectory);
            sftpChannel.put(fileByteInputStream, fileName, sftpChannel.OVERWRITE);        
            try {
                fileByteInputStream.close();
            } catch (IOException e) {
                resultComments = "SFTP Exception: Unable to close Input Stream." + e.getMessage();
                status = RunResult.FAIL;
                e.printStackTrace();
            }
            sftpChannel.exit();
        }
        if (session != null) {
            session.disconnect();
        }
    }
} catch (SftpException e) {
    resultComments = "SFTP Exception " + e.getMessage();
    status = RunResult.FAIL;
    e.printStackTrace();
} 

1 Ответ

0 голосов
/ 25 апреля 2018

Так что я исправил проблему. Кажется, как будто этот метод .....

sftpChannel.put(fileByteInputStream, fileName, sftpChannel.OVERWRITE); 

не работает должным образом. Хотя в документации Jcraft прямо сказано, что ...

put(String src, String dst, int mode)
//Uploads a file.

когда я изменяю его на другой метод пут, как так ....

sftpChannel.put(fileByteInputStream, fileName, null, sftpChannel.OVERWRITE); 

мои проблемы с перезаписью исчезли, если использовать метод put ...

put(String src, String dst, SftpProgressMonitor monitor, int mode)
//Uploads a file.

Я могу передать без каких-либо сбоев, когда файл уже существует, и я хочу перезаписать его.

...