Как я могу выполнить проверку MD5 загруженного контента при использовании выходного потока, который записывается в канал записи? Когда я делаю Storage::create
, MD5 в предоставленном BlobInfo перезаписывается EMPTY_BYTE_ARRAY_MD5
. Это имеет смысл, поскольку, когда капля создается сначала, она действительно пуста. Но я ожидал бы, что какой-нибудь метод на устройстве записи установит обновленный MD5, который, как ожидается, будет действительным после закрытия модуля записи . Я не могу найти способ сделать это, это возможно? Я прикреплю свой код:
Gradle:
api 'com.google.cloud:google-cloud-storage:1.51.0'
Java-код:
import com.google.cloud.WriteChannel;
import com.google.cloud.storage.*;
import com.google.common.io.ByteStreams;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channels;
import java.nio.file.Path;
class StorageServiceImpl {
@Inject
private Storage storage;
public BlobInfo uploadFile(final Path localFile, final String bucketName, final String fileName, final String downloadFileName) throws IOException {
Blob blob = null;
String checksum = md5(localFile);
try (InputStream inputStream = new FileInputStream(localFile.toFile())) {
blob = storage.create(
BlobInfo.newBuilder(bucketName, fileName)
.setContentType("application/octet-stream")
.setContentDisposition(String.format("attachment; filename=\"%s\"", downloadFileName))
.setMd5(checksum)
.build()
);
try (WriteChannel writer = blob.writer(Storage.BlobWriteOption.md5Match())) {
ByteStreams.copy(inputStream, Channels.newOutputStream(writer));
}
} catch (StorageException ex) {
if (!(400 == ex.getCode() && "invalid".equals(ex.getReason()))) {
throw ex;
}
}
return blob;
}
}
Эта проблема появилась после перехода с устаревшего метода Blob create(BlobInfo blobInfo, InputStream content, BlobWriteOption... options);
.