Ответ
Конечно. Вот пример из реального проекта — сервисный класс на Laravel, отвечающий за обработку загрузки файлов с валидацией и сохранением в облачное хранилище:
<?php
namespace AppServices;
use IlluminateHttpUploadedFile;
use IlluminateSupportFacadesStorage;
use IlluminateSupportStr;
class FileUploadService
{
public function uploadUserDocument(UploadedFile $file, int $userId): string
{
// Валидация MIME-типа и размера
$validated = $file->validate([
'mimes:pdf,jpeg,png',
'max:5120', // 5 MB
]);
// Генерация уникального имени для безопасности
$fileName = Str::uuid()->toString() . '.' . $file->extension();
$path = "user_docs/{$userId}/{$fileName}";
// Загрузка в S3-совместимое хранилище
Storage::disk('s3')->put($path, file_get_contents($file->path()));
// Возвращаем публичный URL (с подписанным URL, если нужно)
return Storage::disk('s3')->url($path);
}
}
Этот код демонстрирует работу с фасадами Laravel, безопасную обработку файлов и интеграцию с облачными сервисами.
Ответ 18+ 🔞
А, ну вот, смотри, классика жанра. Сидишь такой, пишешь очередной сервис для загрузки файлов, а в голове одна мысль: "Ёпта, ну сколько можно, опять одно и то же". Но делать-то надо, ибо пользователи — народ ненасытный, им всё подавай картинки, PDF-ки, а потом ещё и жалуются, что что-то не грузится. Волнение ебать.
Вот смотри на этот кусок кода. Вроде бы всё просто, но тут, понимаешь, подозрение ебать чувствую. Казалось бы, взял файл, шлёпнул его куда-нибудь. Ан нет! Если не обложить это дело валидацией со всех сторон, получится пиздопроебибна. Какой-нибудь умник попробует залить тебе исполняемый скрипт вместо фотки котика, и всё, накрылся медным тазом твой сервер.
$validated = $file->validate([
'mimes:pdf,jpeg,png',
'max:5120', // 5 MB
]);
Вот это — святое. Говорим сразу: "Мужик, только PDF, JPEG или PNG, и не больше пяти мегов". А то знаем мы этих художников, которые пытаются RAW-фотку на 50 мегабайт в аватарку запихнуть. Да похуй, что у него камера крутая, у нас тут правила.
Дальше — имя файла. Это вообще отдельная песня. Никогда, слышишь, НИКОГДА не сохраняй оригинальное имя файла. Это хитрая жопа, которая тебя обязательно подведёт. То пробелы, то кириллица, то скрипт какой-нибудь ../../../etc/passwd попробуют впихнуть. Поэтому делаем просто и гениально:
$fileName = Str::uuid()->toString() . '.' . $file->extension();
Вот, универсальный солдат. Сгенерировали случайный UUID, прилепили расширение — и всё, доверия ебать ноль к имени, но зато безопасно. Получается такая манда с ушами, но зато надёжная.
Ну и финальный аккорд — отправка в облако. Раньше бы на свой же диск сохраняли, а потом охуевали, когда место кончается. Сейчас же — ёперный театр — отправил в S3 и забыл. Storage::disk('s3')->put() — и нет проблем. Главное, права доступа там не накосячить, а то получится, что все твои файлы на весь мир открыты. Вот тогда будет тебе хиросима и нигерсраки, а не сервис.
В общем, код вроде простой, но если в нём не разбираться, можно такого впендюрить, что потом месяц расхлёбывать. А так — взял, скопировал, под себя подправил, и работает себе потихоньку. Ебушки-воробушки, да и только.