AWS S3 Bucket Загрузка с помощью заданного запроса - 403 Запрещено, если имя файла содержит символы UnicodePhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 AWS S3 Bucket Загрузка с помощью заданного запроса - 403 Запрещено, если имя файла содержит символы Unicode

Сообщение Anonymous »

Я только что столкнулся с странной проблемой с запросами на блокировку S3 (403 запрещено, без корпуса ответа), если имя файла содержит символы Unicode .
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, например, ä 
, тогда запрос oploadurl дает мне запретный ответ 403 без тела ответа, превращая отладку в угадание. Я только пытался изменить ä в , потому что в другом вопросе Stackoverflow были некоторые ответы, упомянутые кодированием URL -файла, и это сработало.
Таким образом, вопрос - Что мне нужно изменить в этом коде, чтобы не иметь этой проблемы? -Декодируется на их конце (это параметр запроса, конечно, он должен быть опубликован URL, это их собственный SDK, который его кодирует!), И заголовки метаданных также содержат первоначальное имя файла (некодировано). , если это что -то меняет.

Подробнее здесь: https://stackoverflow.com/questions/794 ... e-contains
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»