آپلود فایل ها در لاراول 10 – انجمن DEV

آپلود فایل ها یکی از ویژگی های رایجی است که اکثر برنامه ها از آن استفاده می کنند و در عین حال یکی از مواردی است که من می بینم بسیاری از افراد با آن دست و پنجه نرم می کنند.
لاراول یک API ساده برای کار با فایل سیستم محلی به سادگی ارائه می دهد:
Storage::putFileAs('images', $request->file('file'));
اغلب کاربر نیاز به بررسی اعتبار فایل دارد، حجم فایل، ابعاد، نام، دید، مسیر، دیسک و غیره.
ما می خواهیم فرمی ایجاد کنیم که به ما امکان می دهد یک فایل را آپلود و ارسال کنیم – و یک مسیر این فرم را می پذیرد، ورودی را تأیید می کند و بارگذاری را مدیریت می کند.
با این مقاله، آموزش آپلود فایل گام به گام لاراول 10 را با استفاده از بسته erlandmuchasaj/laravel-file-uploader انجام می دهم.
در این آموزش ما 2 مسیر را ایجاد می کنیم.
یکی برای ایجاد فرمی که کاربر در آن فایل را آپلود کند و دیگری مسیری برای آپلود فایل با استفاده از بسته.
ما یک فرم ساده با استفاده از اجزای رابط کاربری Bootstrap Form ایجاد خواهیم کرد.
اول از همه، اجازه می دهد تا یک پروژه کاملاً جدید لاراول را راه اندازی کنیم.
ابزار خط فرمان را باز کرده و دستور زیر را برای ایجاد یک پروژه لاراول از ابتدا اجرا کنید.
composer create-project laravel/laravel --prefer-dist laravel-file-uploader
سپس وارد دایرکتوری پروژه تازه ایجاد شده می شویم:
cd laravel-file-uploader
سپس بسته لاراول-فایل-آپلودر را نصب می کنیم.
composer require erlandmuchasaj/laravel-file-uploader
پس از آن ما یک پیوند نمادین برای دسترسی به فایل هایی که قرار است برای عموم قابل دسترسی باشند ایجاد می کنیم.
به طور پیش فرض، public
دیسک از local
درایور و فایل های خود را در آن ذخیره می کند storage/app/public
.
برای دسترسی به این فایل ها از وب، باید یک پیوند نمادین از آن ایجاد کنید public/storage
به storage/app/public
.
برای ایجاد پیوند نمادین، می توانید از دستور storage:link Artisan استفاده کنید:
php artisan storage:link
مسیرها را ایجاد کنید.
رفتن به route/web.php
و 2 مسیر اضافی ایجاد کنید. اولی به تجسم فرم رسیدگی می کند و دیگری فرم درخواست POST را مدیریت می کند.
use ErlandMuchasaj\LaravelFileUploader\FileUploader; // <= import the package
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
// visualize the form
Route::get('/files', function (Request $request) {
return view('files');
})->name('files');
// handle the post request
Route::post('/files', function (Request $request) {
$max_size = (int) ini_get('upload_max_filesize') * 1000;
$extensions = implode(',', FileUploader::images());
$request->validate([
'file' => [
'required',
'file',
'image',
'mimes:' . $extensions,
'max:'.$max_size,
]
]);
$file = $request->file('file');
$response = FileUploader::store($file);
return redirect()
->back()
->with('success','File has been uploaded.')
->with('file', $response);
})->name('files.store');
ساخت فایل های blade در لاراول
در این مرحله نمایی را ایجاد می کنیم که فرم آپلود کننده فایل در آن قرار می گیرد.
یک فایل جدید در resources/views/files.blade.php
و مطالب زیر را قرار دهید:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>File uploader</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body class="antialiased">
<div class="container">
<div class="row">
<div class="col-12">
@if ($message = Session::get('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
<strong>{{ $message }}</strong>
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
<ul class="mb-0 p-0">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
</div>
<div class="col-12 py-5">
<div class="card my-5">
<div class="card-header">
<h3>Laravel File Uploader</h3>
</div>
<div class="card-body">
<form method="POST" action="{{ route('files.store') }}" enctype="multipart/form-data">
@method('POST')
@csrf
<div class="mb-3">
<label for="formFileLg" class="form-label">File input example</label>
<input name="file" class="form-control form-control-lg" id="formFileLg"
type="file">
</div>
<div class="mb-3">
<button type="submit" value="submit" class="btn btn-primary">Upload</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
</body>
</html>
این فرم را به کاربر نشان می دهد تا فایل ها را آپلود کند. فرم موجود در این الگوی view به مسیری با نام اشاره می کند files.store
که قبلا در آن ایجاد کردیم routes/web.php
فایل.
این برای این آموزش است.
اگر به اطلاعات بیشتری در مورد بسته استفاده شده نیاز دارید، می توانید اطلاعات بیشتری را در زیر بخوانید:
یک بسته آپلود کننده فایل لاراول ساده و در عین حال قدرتمند
Laravel File Uploader یک راه آسان برای آپلود فایل ها در دیسک های مختلف ارائه می دهد. هدف اصلی بسته حذف کدهای تکراری و دست و پا گیر و ساده سازی آن به چند روش ساده است.
نصب و راه اندازی
می توانید بسته را از طریق composer نصب کنید:
composer require erlandmuchasaj/laravel-file-uploader
استفاده
این بسته کاربرد بسیار آسان و مستقیمی دارد فقط بسته را وارد کنید و فایل را به عنوان پارامتر ارسال کنید و بقیه کارها را انجام می دهد.
use ErlandMuchasaj\LaravelFileUploader\FileUploader
Route::post('/files', function (\Illuminate\Http\Request $request) {
$max_size = (int) ini_get('upload_max_filesize') * 1000;
// FileUploader::images() get all image extensions ex: jpg, png, jpeg, gif, etc.
// FileUploader::documents() get all documents extensions ex: 'csv', 'html', 'pdf', 'doc', 'docx', 'ppt' etc.
$extensions = implode(',', FileUploader::images());
$request->
…
مفید بود؟
اگر تا به حال از این بسته در هر یک از پروژه های خود استفاده کرده اید، در بخش نظرات زیر به من اطلاع دهید.
فراموش نکنید که پسندیدن و اظهار نظر.
دنبال کردن من برای نکات بیشتر توسعه وب، بسته های جدید و موارد دیگر.
با تشکر برای خواندن.