Laravel obyektli xotira bilan Storage fasadining oʻrnatilgan s3 diski orqali ishlaydi. Yuklangan fayllar, avatarlar, hujjatlar va eksportlarni server diski oʻrniga bucketda saqlash mumkin.
Oʻrnatish
Misollar Laravel 10 va undan yangi versiyalar uchun moʻljallangan. Flysystem uchun S3 adapterini oʻrnating:
composer require league/flysystem-aws-s3-v3 "^3.0"
Sozlash
Ulanish parametrlarini .env fayliga qoʻshing:
FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=<Access Key>
AWS_SECRET_ACCESS_KEY=<Secret Key>
AWS_DEFAULT_REGION=default
AWS_BUCKET=my-bucket
AWS_ENDPOINT=https://s3.uzcstorage.uz
AWS_USE_PATH_STYLE_ENDPOINT=true
AWS_URL=https://s3.uzcstorage.uz/my-bucket
config/filesystems.php dagi s3 diski bu oʻzgaruvchilarni allaqachon oʻqiydi. Unga ortiqcha nazorat yigʻindisi sarlavhalarini oʻchiradigan ikki qatorni qoʻshing:
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'request_checksum_calculation' => 'when_required',
'response_checksum_validation' => 'when_required',
'throw' => true,
],
Ulanishni php artisan tinker da tekshiring:
Storage::disk('s3')->put('test.txt', 'Hello, UzCloud!');
Storage::disk('s3')->get('test.txt');
Fayllar bilan ishlash
use Illuminate\Support\Facades\Storage;
$disk = Storage::disk('s3');
$disk->put('docs/hello.txt', 'Hello, UzCloud!'); // write
$text = $disk->get('docs/hello.txt'); // read
$exists = $disk->exists('docs/hello.txt'); // check
$disk->copy('docs/hello.txt', 'archive/hello.txt'); // copy
$disk->delete('docs/hello.txt'); // delete
$files = $disk->files('docs'); // list a folder
$disk->putFileAs('backups', new \Illuminate\Http\File('/tmp/backup.zip'), 'backup.zip'); // stream a large file
Shakldan fayllarni yuklash
public function store(Request $request)
{
$request->validate(['avatar' => 'required|image|max:5120']);
// Saves to s3 under avatars/<random name>.<ext> and returns the path
$path = $request->file('avatar')->store('avatars', 's3');
$request->user()->update(['avatar_path' => $path]);
return back();
}
Fayllarga havolalar
Standart holatda fayllar yopiq. Yopiq fayllar uchun vaqtinchalik havola bering:
$url = Storage::disk('s3')->temporaryUrl($path, now()->addMinutes(30));
// Force download with a file name
$url = Storage::disk('s3')->temporaryUrl($path, now()->addMinutes(30), [
'ResponseContentDisposition' => 'attachment; filename="report.pdf"',
]);
Ommaviy fayllar uchun (masalan, mahsulot rasmlari) bucket siyosati yordamida papkaga oʻqish huquqini oching va doimiy havoladan foydalaning:
$url = Storage::disk('s3')->url('public/products/1.jpg');
// https://s3.uzcstorage.uz/my-bucket/public/products/1.jpg
Brauzerdan bevosita yuklash
Katta fayllarni PHP orqali oʻtkazmasdan, brauzerdan bevosita bucketga yuklagan maʼqul. temporaryUploadUrl usuli bilan vaqtinchalik yuklash havolasini yarating (Laravel’ning dolzarb versiyalarida mavjud; eski versiyalarda havolani PHP maqolasidagidek SDK orqali yarating):
['url' => $url, 'headers' => $headers] = Storage::disk('s3')->temporaryUploadUrl(
'uploads/' . Str::uuid() . '.mp4', now()->addMinutes(10)
);
return response()->json(compact('url', 'headers'));
Brauzer faylni fetch(url, { method: "PUT", headers, body: file }) soʻrovi bilan yuboradi. Bucket uchun CORS ni sozlang.
Maslahat
public va local disklarini vaqtinchalik fayllar uchun qoldiring, foydalanuvchi fayllarini esa s3 ga oʻtkazing: shunda ilova serverlari holat saqlamaydi, ularni maʼlumotlarni yoʻqotmasdan masshtablash va qayta yaratish mumkin.