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






Используемый вами метод 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()).
Рекомендую отладить ситуацию, распечатав содержимое
$fileNameи посмотреть, что там есть.