如何使用 Livewire 上传作业文件?

How to job file upload with Livewire?

我需要通过排队将图像上传到 S3,然后使用 Livewire

上传到 S3

我的 livewire 组件:

class s3 extends Component
{
    use WithFileUploads;

    public $image;

    public function save()
    {
        $this->validate(['image' => 'image']);

        dispatch(new ImageUpload($this->image));

        return 'success';
    }
}

我的队列工作class:

class ImageUpload implements ShouldQueue
{
    
    public $image;

    public function __construct($image)
    {
        $this->image = $image;
    }

    public function handle()
    {
        Storage::disk('s3')->put('uploads/product_images/', $this->image, 'public');
    }
}

我遇到了这个错误::

Exception
Serialization of 'Livewire\TemporaryUploadedFile' is not allowed

你必须传递一些可以序列化的东西。

我想不到的一种方法(因为看起来您正在存储临时文件)是简单地将临时文件名和路径传递给您的工作,它将处理其余部分。

像这样的东西应该可以工作:

您的 Livewire 组件:

class s3 extends Component
{
    use WithFileUploads;

    public $image;

    public function save()
    {
        $this->validate(['image' => 'image']);

        $image = [
            'name' => $this->image->getClientOriginalName(),
            'path' => $this->image->getRealPath(),
        ];

        dispatch(new ImageUpload($image));

        return 'success';
    }
}

你的工作class:

class ImageUpload implements ShouldQueue
{
    
    public $image;

    public function __construct($image)
    {
        $this->image = $image;
    }

    public function handle()
    {
        Storage::disk('s3')->put('uploads/product_images/'.$this->image['name'], file_get_contents($this->image['path']), 'public');
    }
}

它很粗糙,但应该可以让您朝着正确的方向前进。