AWS S3 PutObjectAsync ETag не соответствует MD5 - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь загрузить файл в S3 (PutObjectAsync), а затем проверить, что он там есть.

Я обнаружил, что мой сгенерированный хэш MD5 не соответствует возвращенному ETag. Какой правильный способ проверки файла?

                using (var fileDataStream = new MemoryStream())
                {
                    using (var md5 = MD5.Create())
                    {
                        file.CopyTo(fileDataStream);

                        var hash = md5.ComputeHash(fileDataStream.ToArray());
                        var hashAsString = Convert.ToBase64String(hash);

                        var request = new PutObjectRequest
                        {
                            CannedACL = S3CannedACL.PublicRead,
                            InputStream = fileDataStream,
                            BucketName = _optionsAws.Value.MediaBucketName,
                            Key = s3FileName
                        };

                        var result = await _s3Client.PutObjectAsync(request);

                        if (result.ETag != hashAsString)
                        {
                            ret.isSuccess = false;
                            ret.errorMessage = "Non matching hash";
                        }
                        else
                        {
                            ret.isSuccess = true;
                        }
                    }
                }

1 Ответ

0 голосов
/ 16 июля 2019

Я столкнулся с той же проблемой. Решил это таким образом, и хэш MD5 соответствовал ETag из загрузки S3 просто отлично, хотя мне пришлось обрезать символ "" "(двойная кавычка) из ответа ETag. Я не верю, что это сработает, если вы загрузить файл в несколько частей.

     public static string CalculateMD5Hash(byte[] bytes)
        {
            MD5 md5 = MD5.Create();
            byte[] hash = md5.ComputeHash(bytes);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("x2"));
            }
            return sb.ToString();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...