Загрузка кажется успешной, и я вижу файлы в моем ведре. Однако, когда я пытаюсь извлечь метаданные, используя HeadObjectCommand , свойство метаданных ответа неизменно пусто.
Код: Выделить всё
import { S3Client, PutObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';
const s3Client = new S3Client({
region: 'MyRegion',
credentials: {
accessKeyId: 'MyAccessKey',
secretAccessKey: 'MySecretAccessKey',
},
});
export const BUCKET_BASE_URL = "MyBucketBaseURL";
export const getHrefAgainstKey = (key) => {
return `${BUCKET_BASE_URL}${key}`;
};
const S3MediaUploader = () => {
const [file, setFile] = useState(null);
const [metadata, setMetadata] = useState({ title: '', description: '' });
const [uploadedMedia, setUploadedMedia] = useState([]);
const [loading, setLoading] = useState(false);
const bucketName = 'MyBucketName';
const handleFileChange = (e) => {
setFile(e.target.files[0]);
};
const handleMetadataChange = (e) => {
setMetadata({ ...metadata, [e.target.name]: e.target.value });
};
const handleUpload = async () => {
if (!file) {
alert('Please select a file.');
return;
}
setLoading(true);
const reader = new FileReader();
reader.onload = async (event) => {
const arrayBuffer = event.target.result;
const uint8Array = new Uint8Array(arrayBuffer);
const params = {
Bucket: bucketName,
Key: file.name,
Body: uint8Array,
Metadata: {
title: metadata.title.toLowerCase(),
description: metadata.description.toLowerCase(),
},
ACL: "public-read",
ContentType: file.type,
};
try {
const response = await s3Client.send(new PutObjectCommand(params));
alert('File uploaded successfully!');
setFile(null);
setMetadata({ title: '', description: '' });
fetchMedia();
} catch (error) {
console.error('Error uploading file:', error);
alert('Error uploading file.');
} finally {
setLoading(false);
}
};
reader.onerror = () => {
console.error('Error reading file.');
setLoading(false);
};
reader.readAsArrayBuffer(file);
};
const fetchMedia = async () => {
setLoading(true);
try {
const response = await s3Client.send(new ListObjectsV2Command({ Bucket: bucketName }));
if (response.Contents) {
const media = await Promise.all(
response.Contents.map(async (item) => {
const getObjectParams = {
Bucket: bucketName,
Key: item.Key,
};
const //Empty Metadata = await s3Client.send(new HeadObjectCommand(getObjectParams)); **// Getting Empty Metadata.Metadata**
return {
key: item.Key,
href: getHrefAgainstKey(item.Key),
url: BUCKET_BASE_URL,
metadata: {metadataResponse.Metadata},
};
})
);
setUploadedMedia(media);
} else {
setUploadedMedia([]);
}
} catch (error) {
console.error('Error fetching media:', error);
} finally {
setLoading(false);
}
};
Код: Выделить всё
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*",
"s3tables:*",
"iam:PassRole"
],
"Resource": "*"
}
]
}
"dependencies": {
"@aws-sdk/client-s3": "^3.749.0",
}
< /code>
Устранение неисправностей, предпринятые: < /strong>
подтвердил, что процесс загрузки завершается без ошибок.
подтвердил, что файлы присутствуют в ковше S3.
попробовал использование как headObjectCommand < /code>, так и GetObjectCommand < /code> для получения метаданных.
Проверенные разрешения пользователя IAM для обеспечения полного доступа S3.
обеспечил, чтобы ключи метаданных были строчных (в соответствии с. Требования S3). < /P>
ожидаемое поведение: < /strong>
Я ожидаю, что свойство метаданных HeadObjectCommand или GetObjectCommand, чтобы содержать значения заголовка и описание, установленные во время загрузки .
Фактическое поведение:
свойство метаданных неизменно пусто.>
Подробнее здесь: https://stackoverflow.com/questions/794 ... -client-s3