0

現在、Java の S3 SDK で AWS の TransferManager を使用して、SFTP サーバーから S3 へのアップロードをトリガーしています。このアップロードをトリガーする方法を以下に示します。

(疑似コード...)

    @Autowired
    TransferManager transferManager;

    @Autowired
    SftpStreamFactory sftpStreamFactory;

    SftpStream sftpStream = sftpStreamFactory.createStream(filePath);
    ObjectMetadata objectMetadata = new ObjectMetadata();
    objectMetadata.setContentLength(sftpStream.getSizeBytes());
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, sftpStream.getStream(), objectMetadata);
    putObjectRequest.setGeneralProgressListener(new UploadBeginEndNotificationListener(uploadRequest, statusNotifier));
    
    transferManager.upload(putObjectRequest);

の定義は次のSftpStreamとおりです。

@AllArgsConstructor
public class SftpStreamFactory {

@Getter
@AllArgsConstructor
public static class SftpStream {
    private final long sizeBytes;
    private final InputStream stream;
}

private final SftpRemoteFileTemplate sftpTemplate;
private final SftpProperties sftpProperties;

public SftpStream createStream(Path relativePath) {
    return sftpTemplate.<SftpStream, ChannelSftp>executeWithClient(session -> createStream(session, relativePath));
}

SftpStream createStream(ChannelSftp channelSftp, Path relativePath) {

    String path = sftpProperties.getRoot().resolve(relativePath).toString();

    try {
        SftpATTRS fileAttrs = channelSftp.lstat(path);
        long size = fileAttrs.getSize();
        return new SftpStream(size, channelSftp.get(path));
    }
    catch (SftpException e) {
        throw new UncheckedIOException(new NestedIOException("SFTP Error", e));
    }
}

}

このアップロード方法は正常に機能します。ただし、マルチパート アップロードが一時停止/キャンセル/途中で中止された場合、最初からやり直すのではなく、中断したところから再開したいと考えています。を受け取る TransferManagersresumeUploadメソッドを認識していますPersistableUpload

ただし、 の javadoc ではPersistableUpload、パスがコンストラクターに渡されることを期待しており、後でそこからオブジェクト fileを作成しようとします: https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws /services/s3/transfer/PersistableUpload.htmlFile

私たちが疑問に思っているのは、このファイル オブジェクトを持たずにアップロードを再開する方法はありますChannelSftpか? つまり、ファイルではなくストリームからアップロードを再開できますか? または、そのような再開を実行するには、低レベルの s3 API を使用するように切り替える必要があります。任意の提案をいただければ幸いです。

編集 - もう少し調べて、既存のアップロードに UploadId を渡すことさえ、ファイルがない場合、doUpload メソッドは例外をスローします。何か案は?

4

1 に答える 1