سلام وقت بخیر
دوستان من میخوام با کمک لایوایر یک آپلود داشته باشم.
الان مشکل من اینجاست که وقتی آپلود انجام میشه یکبار ویدیو داخل پوشه storage ذخیره میشه و وقتی بر روی دکمه ثبت میزنم بار دیگه همون زمان ( چند دقیقه) برای آپلود اول برده برای دومی هم میبره.
من میخوام به این شکل باشه که داخل پوشه storage ذخیره نشه و مستقیما داخل هاست دانلود ذخيره بشه.
برای این کار اومدم داخل فایل livewire.php دیسک رو تغییر دادم و اوکی بود، اما داخل پروژه آپلود های دیگه ای هم دارم که نمیخوام داخل هاست دانلود بره و بلکه میخوام داخل پروژه ذخیره بشه.
چطور میتونم برای هر کامپوننت یک دیسک مجزا داشته باشم؟
ممنون
سلام سامان جان
شما میتونید دیسک های مختلف رو توی این مسیر config/filesystems.php تعریف کنید بعنوان مثال :
'disks' => [
// ...
'download' => [
'driver' => 'local',
'root' => public_path('downloads'),
'url' => env('APP_URL').'/downloads',
'visibility' => 'public',
],
],
استفاده از دیسکها در Livewire
توی کامپوننت های لایو وایر هم میتونی برای آپلود فایل از دیسک های تعریف شده استفاده کنی
$this->validate([
'file' => 'required|mimes:jpg,png,pdf|max:2048', // مثلا حداکثر 2MB
]);
$path = $this->file->store('uploads', 'download'); // آپلود فایل به دیسک download
// انجام عملیاتهای دیگر با $path...
@mahdi.nazari
ممنون
ببینید من اگه از store استفاده کنم، دو تا فایل ایجاد میشه یکی داخل پوشه storage و یکی دیگه داخل هاست دانلود.
من میخوام به این شکل نباشه، میخوام فقط یک فایل ایجاد و اونم داخل هاست دانلود.
بله متوجه شدم خب میتونی از این راه حل و متد store استفاده کنی
use Livewire\Component;
use Illuminate\Support\Facades\Storage;
use Livewire\WithFileUploads;
class MyComponent extends Component
{
use WithFileUploads;
public $file;
public function saveFile()
{
$this->validate([
'file' => 'required|mimes:jpg,png,pdf|max:2048',
]);
$path = $this->file->storePublicly('uploads', ['disk' => 'download']);
// انجام عملیاتهای دیگه با $path...
}
// ...
}
@mahdi.nazari
ممنون از راهنمایی تون
اما مشکل من اینه که وقتی ویدیو آپلود میشه و بعدش روی دکمه ثبت میزنم همون زمانی که که برای آپلود ویدیو طول کشیده موقع submit شدن فرم هم طول میشکه که اگه حجم ویدیو زیاد باشه خطای timeout میده.
من میخوام وقتی ویدیو داخل livewire-tmp آپلود همون فایل رو انتقال بدم به هاست دانلود، این مورد رو چطور میتونم انجام بدم؟
مرسی
میتونی از طریق یه فرایند پس زمینه برای انتقال فایل های آپلود شده استفاده کنی به این ترتیب وقتی کاربر فایلو آپلود میکنه و فرم رو سابمیت عملیات asynchronous کار خودشو میکنه و کاربر منتظر پیام موفقیت فقط میمونه
میتونی از Job و Queue خود لایووایر هم استفاده کنی که در نهایت اینطوری میشه
برای ایجاد job
php artisan make:job TransferToDownloadHost
پیکربندی job
public function handle()
{
// کد انتقال فایلها به هاست دانلود را اینجا پیادهسازی کنید
}
استفاده از job
use App\Jobs\TransferToDownloadHost;
// ...
public function submitForm()
{
// کد پردازش دیگر فرم
// ایجاد یک Job و ارسال فایلهای آپلود شده به آن
TransferToDownloadHost::dispatch($uploadedFiles);
// نمایش پیام موفقیت آمیزی به کاربر
session()->flash('success', 'فرم با موفقیت ارسال شد.');
}
با انجام اینکار توی پس زمینه همچی سوسکی اجرا میشه و میتونی ارور هاتو اینجا هندل کنی
تا جایی که بلد بودم ❤️😊
@mahdi.nazari
به این اررور برخورد می کنم
Serialization of 'Livewire\TemporaryUploadedFile' is not allowed
خب باید از راه دیگه برای انتقال job استفاده کنید بنظرم
از این مسیر میتونی به برای دسترسی و انتقال فایل ها به هاست دانلود استفاده کنید
Livewire\TemporaryUploadedFile
کامپوننت Livewire:
use App\Jobs\TransferToDownloadHost;
// ...
public function submitForm()
{
// کد پردازش دیگر فرم
// ارسال مسیر فایلهای آپلود شده به Job
$uploadedFilesPath = $this->uploadedFiles->map(function ($file) {
return $file->getRealPath();
});
TransferToDownloadHost::dispatch($uploadedFilesPath);
// نمایش پیام موفقیت آمیزی به کاربر
session()->flash('success', 'فرم با موفقیت ارسال شد.');
}
job
public function handle()
{
foreach ($this->uploadedFilesPath as $filePath) {
// کد انتقال فایلها به هاست دانلود با استفاده از $filePath
}
}
@mahdi.nazari
الان این خطا رو میگیره
Method Livewire\TemporaryUploadedFile::map does not exist
use App\Jobs\TransferToDownloadHost;
// ...
public function submitForm()
{
// کد پردازش دیگر فرم
// ارسال مسیر فایلهای آپلود شده به Job
$uploadedFilesPath = $this->uploadedFiles->map(function ($file) {
return $file->getRealPath();
});
TransferToDownloadHost::dispatch($uploadedFilesPath);
// نمایش پیام موفقیت آمیزی به کاربر
session()->flash('success', 'فرم با موفقیت ارسال شد.');
}
job
public function handle()
{
foreach ($this->uploadedFilesPath as $filePath) {
// کد انتقال فایلها به هاست دانلود با استفاده از $filePath
}
}
با دقت به مطالب نگاه کنی متوجه میشی چطور باید کاستومشون کنی
این کد منه
$uploadedFilesPath = $this->upload_video->map(function ($file) {
return $file->getRealPath();
});
TransferToDownloadHost::dispatch($uploadedFilesPath, $channel_ename);
کد job
foreach ($this->upload_video as $filePath) {
$filePath->store($this->channel_ename, 'ftp_video_post');
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟