Saman
1 سال پیش توسط Saman مطرح شد
10 پاسخ

تعییر دیسک لایوایر

سلام وقت بخیر
دوستان‌ من میخوام با کمک لایوایر یک آپلود داشته باشم.
الان مشکل من اینجاست که وقتی آپلود انجام میشه یکبار ویدیو داخل پوشه storage ذخیره میشه و وقتی بر روی دکمه ثبت میزنم بار دیگه همون زمان ( چند دقیقه) برای آپلود اول برده برای دومی هم میبره.
من میخوام به این شکل باشه که داخل پوشه storage ذخیره نشه و مستقیما داخل هاست دانلود ذخيره بشه.
برای این کار اومدم داخل فایل livewire.php دیسک رو تغییر دادم و اوکی بود، اما داخل پروژه آپلود های دیگه ای هم دارم که نمیخوام داخل هاست دانلود بره و بلکه میخوام داخل پروژه ذخیره بشه.
چطور میتونم برای هر کامپوننت یک دیسک مجزا داشته باشم؟
ممنون


ثبت پرسش جدید
مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

سلام سامان جان

شما میتونید دیسک های مختلف رو توی این مسیر 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...

Saman
تخصص : برنامه نویس وب
@samanzdev 1 سال پیش آپدیت شد
0

@mahdi.nazari
ممنون
ببینید من اگه از store استفاده کنم، دو تا فایل ایجاد میشه یکی داخل پوشه storage و یکی دیگه داخل هاست دانلود.
من میخوام به این شکل نباشه، میخوام فقط یک فایل ایجاد و اونم داخل هاست دانلود.


مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

بله متوجه شدم خب میتونی از این راه حل و متد 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...
    }

    // ...
}

Saman
تخصص : برنامه نویس وب
@samanzdev 1 سال پیش مطرح شد
0

@mahdi.nazari
ممنون از راهنمایی تون
اما مشکل من اینه که وقتی ویدیو آپلود میشه و بعدش روی دکمه ثبت میزنم همون زمانی که که برای آپلود ویدیو طول کشیده موقع submit شدن فرم هم طول میشکه که اگه حجم ویدیو زیاد باشه خطای timeout میده.
من میخوام وقتی ویدیو داخل livewire-tmp آپلود همون فایل رو انتقال بدم به هاست دانلود، این مورد رو چطور میتونم انجام بدم؟
مرسی


مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

میتونی از طریق یه فرایند پس زمینه برای انتقال فایل های آپلود شده استفاده کنی به این ترتیب وقتی کاربر فایلو آپلود میکنه و فرم رو سابمیت عملیات 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', 'فرم با موفقیت ارسال شد.');
}
با انجام اینکار توی پس زمینه همچی سوسکی اجرا میشه و میتونی ارور هاتو اینجا هندل کنی
تا جایی که بلد بودم ❤️😊

Saman
تخصص : برنامه نویس وب
@samanzdev 1 سال پیش آپدیت شد
0

@mahdi.nazari
به این اررور برخورد می کنم
Serialization of 'Livewire\TemporaryUploadedFile' is not allowed


مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

خب باید از راه دیگه برای انتقال 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
    }
}

Saman
تخصص : برنامه نویس وب
@samanzdev 1 سال پیش مطرح شد
0

@mahdi.nazari
الان این خطا رو میگیره
Method Livewire\TemporaryUploadedFile::map does not exist


مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0
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
    }
}

با دقت به مطالب نگاه کنی متوجه میشی چطور باید کاستومشون کنی


Saman
تخصص : برنامه نویس وب
@samanzdev 1 سال پیش مطرح شد
0
    این کد منه
        $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');
        }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام