Backend Code Это генерирует заданный URL: < /p>
Код: Выделить всё
$userId = ...; // Irrelevant.
$filename = ...; // Comes from POST data.
$safeName = trim(preg_replace('/[^a-z0-9\-_.]/i', '-', $filename), '-'); // AWS only allows specific characters in key.
$key = sprintf('user-documents/%s/%s', $userId, $safeName);
$metadata = [
'type' => 'USER_DOCUMENT',
'userId' => $userId,
'filename' => $filename, // The raw one from POST.
];
$s3 = new S3Client([
'region' => getenv('AWS_REGION'),
'version' => 'latest',
'credentials' => CredentialProvider::env(),
]);
$uploadUrl = $s3->createPresignedRequest(
$s3->getCommand('PutObject', [
'Bucket' => getenv('AWS_BUCKET_USER_DATA'),
'Key' => $key,
'Metadata' => $metadata,
]),
'+1 hour',
)->getUri();
$response = [
'uploadUrl' => $uploadUrl,
'metadata' => $metadata,
];
< /code>
код фронта, который загружает файлы на S3: < /p>
const file = fileInput.files[0];
const response = await getUploadUrl(file.name); // This is where the POST filename comes from.
await fetch(response.uploadUrl, {
method: 'PUT',
headers: {
'x-amz-meta-type': response.metadata.type,
'x-amz-meta-userid': response.metadata.userId,
'x-amz-meta-filename': response.metadata.filename
},
body: file,
}).then(resp => {
if (!resp.ok) {
throw new Error('File upload failed: ' + resp.status + ' ' + resp.statusText)
}
});
< /code>
Этот код работает полностью хорошо, если имена файлов находятся в ASCII, но если имя файла содержит букву Unicode, например, ä
Таким образом, вопрос - Что мне нужно изменить в этом коде, чтобы не иметь этой проблемы? -Декодируется на их конце (это параметр запроса, конечно, он должен быть опубликован URL, это их собственный SDK, который его кодирует!), И заголовки метаданных также содержат первоначальное имя файла (некодировано).
Код: Выделить всё
aws/[email protected]
Подробнее здесь: https://stackoverflow.com/questions/794 ... e-contains