Comme toujours, c'est une réimpression du blog. https://munchkins-diary.hatenablog.com/entry/2019/10/28/230924 Je n'ai pas beaucoup écrit récemment, mais je veux le reprendre bientôt.
J'ai écrit qu'il est facile de devenir accro à la méthode d'obtention de la somme de contrôle du fichier sur S3, et comment calculer la somme de contrôle du fichier avec Java en bonus en bas.
J'espère que cela aide quelqu'un. (Pas trop)
J'écrivais un processus répertoriant un fichier de plusieurs Go dans S3 et je voulais réessayer en raison d'un échec du traitement ultérieur.
Dans ce cas, il est inutile de retélécharger le fichier, mais il est possible que le fichier cible dans le stockage source de migration ait été modifié. Par conséquent, je ne veux réessayer le téléchargement que si j'ai déjà le fichier «exactement le même» sur S3.
Dans ce cas, il est facile de comparer les sommes de contrôle, j'ai donc écrit le code comme suit en utilisant l'API getObjectMetaData
de S3.
private boolean shouldSkip(String bucketName, String key, String md5CheckSum) {
try {
ObjectMetadata meta = s3Client.getObjectMetadata(bucketName, key);
if (meta == null || meta.getContentMD5() == null) {
log.info("meta data not exist for the file {} in bucket {}", key, bucketName);
return false;
}
log.info(
"Checksum of existing file is {} and present file checksum is {}",
meta.getContentMD5(),
md5CheckSum);
return meta.getContentMD5().equals(md5CheckSum);
} catch (SdkClientException e) {
log.error("Exception thrown while validating the checksum of the file {}", key, e);
return false;
}
}
Mais ça ne marche pas. ʻObjectMetaData # contentMD5` est inévitablement nul.
Après vérification, il semble que la somme de contrôle de l'objet existant dans S3 soit donnée à ʻEtag` au lieu de contentMD5.
Ensuite, à quoi sert contentMD5? Il est ajouté à l'en-tête HTTP au moment de la mise à jour et utilisé pour la confirmation de falsification (utilisation correcte) dans S3, de sorte qu'il n'est pas retourné lors de l'obtention d'un objet avec get.
Par conséquent, si vous souhaitez connaître la somme de contrôle du fichier supprimé de S3, vous devez la comparer avec Etag.
Comme ça.
private boolean shouldSkip(String bucketName, String key, String md5CheckSum) {
try {
ObjectMetadata meta = this.s3Client.getObjectMetadata(bucketName, key);
if (meta == null || meta.getETag() == null) {
log.info("meta data not exist for the file {} in bucket {}", key, bucketName);
return false;
}
log.info(
"Checksum of existing file is {} and present file checksum is {}",
meta.getETag(),
md5CheckSum);
return meta.getETag().equals(md5CheckSum);
} catch (SdkClientException e) {
log.error("Exception thrown while validating the checksum of the file {}", key, e);
return false;
}
}
Cela fonctionne très bien. J'espère que cela aide quelqu'un.
Pour ceux qui ont recherché une somme de contrôle sur Google et sont arrivés par avion, voici comment calculer la somme de contrôle en Java.
public static String checkMd5Checksum(File file) {
try (BufferedInputStream is = new BufferedInputStream(new FileInputStream(file))) {
return DigestUtils.md5Hex(is);
} catch (Exception e) {
// Not likely to occur.
log.error(
"ERROR Happened while calculating the check sum for file {}", file.getAbsolutePath(), e);
return "NOT FOUND";
}
}
Pour sha256, changez simplement DigestUtils # md5Hex
en DigestUtils # sha256Hex
.
C'était un mémo.
Recommended Posts