Я пытаюсь переименовать объект в S3-совместимом хранилище, скопировав его в новый ключ, а затем удалив старый в Cloud Flare R2.
Я использую AWSSDK.S3 (4.0.13.1)
Но я столкнулся с этой ошибкой:
AWS SDK .NET — CopyObject завершается с ошибкой «Заголовок» 'x-amz-tagged-directive' со значением 'REPLACE' не реализована"
Вот соответствующая часть кода:
private (bool success, string error) RenameHotelImageS3(HotelImageStorageLocation config, int propertyId, string oldLink, string newFileName)
{
if (config == null) return (false, "S3 config is null");
if (string.IsNullOrWhiteSpace(oldLink)) return (false, "Old link is empty");
if (string.IsNullOrWhiteSpace(newFileName)) return (false, "New filename is empty");
try
{
var client = new AmazonS3Client(config.S3.AccessKey, config.S3.SecretKey, new AmazonS3Config
{
ServiceURL = config.S3.Url,
ForcePathStyle = true
});
string oldFileName;
try
{
var uri = new Uri(oldLink);
oldFileName = Path.GetFileName(uri.LocalPath);
}
catch
{
oldFileName = Path.GetFileName(oldLink);
}
if (string.IsNullOrWhiteSpace(oldFileName))
return (false, "Invalid old file name from link");
var sourceKey = $"{config.S3.RootPathName}/{propertyId}/{oldFileName}";
var destinationKey = $"{config.S3.RootPathName}/{propertyId}/{newFileName}";
var getRequest = new GetObjectMetadataRequest
{
BucketName = config.S3.Bucket,
Key = sourceKey
};
try
{
client.GetObjectMetadata(getRequest);
}
catch (AmazonS3Exception ex)
{
if (ex.StatusCode == HttpStatusCode.NotFound)
return (false, $"Source file not found: {sourceKey}");
}
var copyRequest = new CopyObjectRequest
{
SourceBucket = config.S3.Bucket,
SourceKey = sourceKey,
DestinationBucket = config.S3.Bucket,
DestinationKey = destinationKey,
CannedACL = S3CannedACL.PublicRead,
ChecksumAlgorithm = ChecksumAlgorithm.SHA256,
TaggingDirective = TaggingDirective.REPLACE
};
var copyResponse = client.CopyObject(copyRequest);
if (copyResponse.HttpStatusCode != HttpStatusCode.OK &&
copyResponse.HttpStatusCode != HttpStatusCode.Created &&
copyResponse.HttpStatusCode != HttpStatusCode.Accepted)
{
return (false, $"Copy failed: {copyResponse.HttpStatusCode}");
}
var deleteRequest = new DeleteObjectRequest
{
BucketName = config.S3.Bucket,
Key = sourceKey
};
client.DeleteObject(deleteRequest);
return (true, "");
}
catch (AmazonS3Exception s3Ex)
{
return (false, $"S3 error: {s3Ex.Message} (Status: {s3Ex.StatusCode}, ErrorCode: {s3Ex.ErrorCode})");
}
catch (Exception ex)
{
return (false, ex.Message);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -with-valu