S3 добавляет случайную строку к имени загруженного файла

я пытаюсь переместить все свои загрузки на s3, у меня есть 2 типа файлов

1 - файлы, которые уже существуют на моем локальном сервере

 Storage::disk('s3')->put( $file->name , Storage::get($file->path));

2 - загружаются новые файлы

    $fileName = $request->file('attachment')->getClientOriginalName();
    $res = Storage::disk('s3')->put($fileName, $request->attachment);

так что для первой группы проблем нет, файлы заливаются на s3 с заданным именем

но для второй группы по какой-то причине s3 добавляет некоторую случайную строку к имени файла, например, если я загружаю файл и даю имя как

v26-how-to-list-users-in-linux.png

в ответ получаю

v26-how-to-list-users-in-linux.png/M53gpy5KvIglCMOBXOnx3KaqghaJ4DQGXzLIkLyA.png

на s3 по какой-то причине добавляется /M53gpy5KvIglCMOBXOnx3KaqghaJ4DQGXzLIkLyA.png в конец имени файла

вот еще один пример загруженного файла с этим именем

v26-testing.txt

на s3 я получаю

v26-testing.txt/c36EPgaDMgPb8RKHIyyZCPaxWMJR0g1yV10JVGQF.txt

это происходит только для прямой загрузки, т.е.:

$res = Storage::disk('s3')->put($fileName, $request->attachment);

когда я перемещаю существующие файлы из локального хранилища в s3, он не добавляет никаких дополнительных символов к имени файла

Рекомендую отладить ситуацию, распечатав содержимое $fileName и посмотреть, что там есть.

John Rotenstein 03.04.2023 14:28

Какой тип $request->attachment? Это File? Если это так, Laravel затем использует разные методы для обработки пути/имени файла, обычно он ожидает там содержимое файла. Вы можете попробовать изменить его на это, если это не так. Дайте мне знать, если это сработает, и я опубликую как ответ

Destroy666 03.04.2023 14:46

Это делает PHP/Laravel, а не S3.

jarmod 03.04.2023 14:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используемый вами метод put ожидает содержимое файла в качестве второго аргумента:

public function put($path, $contents, $options = [])

Вы передаете содержимое с помощью Storage::get($file->path) в 1-м случае, но во 2-м вы, кажется, передаете объект File/UploadedFile, что приводит к putвызовуputFile функции:

return $this->putFile($path, $contents, $options);

Затем вызывает функциюputFileAs с вашим именем в качестве первого $path аргумента и $file->hashName в качестве третьего $name аргумента:

return $this->putFileAs($path, $file, $file->hashName(), $options);

И, наконец, эта функция присваивает имя файла, которое вы видите:

$path = trim($path.'/'.$name, '/'), $stream, $options

Исправить

Один из способов исправить это — изменить $request->attachment, чтобы вернуть содержимое файла. Изменение его на $request->attachment->get() должно работать, если это стандартный объект запроса UploadedFile (обычно вы использовали бы $request->file('attachment')->get()).

Другие вопросы по теме