現在、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 メソッドは例外をスローします。何か案は?