Wie kann ich den Inhalt von md5 einstellen, wenn ich eine Datei auf S3 hochlade?

Ich versuche, den Content-MD5-Wert festzulegen, wenn ich eine Datei in S3 hochlade. Ich kann den md5-Hash-String sehen und übergebe ihn anmetadata.setContentMD5() aber nachdem die Datei hochgeladen wurde, kann ich diesen Wert in der Webkonsole nicht sehen und ich kann ihn nicht über Java-Code abrufen.

Ich bin zu dem Schluss gekommen, dass ich das Ziel der Inhalt-MD5-Get / Set-Methoden wahrscheinlich falsch verstehe. Werden sie verwendet, um den aws-Server zu überprüfen, ob der empfangene Dateiinhalt mit dem übereinstimmt, was ich sende? Wenn das der Fall ist, sollte ich einen Wert mit @ sendsetContentMD5(my_md5) beim hochladen, aber soll ich dann einfach den wert von @ vergleichgetETag() mit meiner berechneten md5-Hex-Zeichenfolge, wenn ich später versuche, das Objekt von S3 herunterzuladen?

Mache ich etwas falsch, wenn ich versuche, diesen md5-Wert einzustellen?

String access_key = "myaccesskey";
String secret_key = "mysecretkey";
String bucket_name = "mybucketname";
String destination_key = "md5_test.txt";
String file_path = "C:\\my-text-file.txt";

BasicAWSCredentials creds = new BasicAWSCredentials(access_key, secret_key);
AmazonS3Client client = new AmazonS3Client(creds);
client.setRegion(RegionUtils.getRegion("us-east-1"));

File file = new File(file_path);

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("text/plain");
metadata.setContentLength(file.length());

FileInputStream fis = new FileInputStream(file);
byte[] content_bytes = IOUtils.toByteArray(fis);
String md5 = new String(Base64.encodeBase64(DigestUtils.md5(content_bytes)));
metadata.setContentMD5(md5);

PutObjectRequest req = new PutObjectRequest(bucket_name, destination_key, file).withMetadata(metadata);
PutObjectResult result = client.putObject(req);

GetObjectMetadataRequest mreq = new GetObjectMetadataRequest(bucket_name, destination_key);
ObjectMetadata retrieved_metadata = client.getObjectMetadata(mreq);

// I think I expected getContentMD5 below to show the string I passed in
// during the upload, but the below prints "md5:null"
System.out.println("md5:" + retrieved_metadata.getContentMD5());

Berechne ich den MD5-String falsch? Wenn ich eine zufällige Zeichenfolge übergebe, erhalte ich eine Fehlermeldung, sodass S3 anscheinend mit dem, was ich über den obigen Code sende, zufrieden ist. Und wenn die MD5-Zeichenfolge korrekt ist, warum kann ich sie später nicht abrufen, wenn ich das @ verwendclient.getContentMD5() Methode? Ich verstehe, dass ETag die MD5-Hex-Zeichenfolge sein sollte, und ich kann dies auch für meine hochgeladene Datei berechnen (und die gleiche Zeichenfolge erhalten, die S3 berechnet), also sollte ich nicht erwarten, dass getContentMD5 () jemals eine hat ein Wert für eine heruntergeladene Datei?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage