如何使用Livewire上传文件?

时间:2020-09-29 14:20:16

标签: php laravel laravel-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 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

1 个答案:

答案 0 :(得分:1)

您将必须传递一些可以序列化的内容。

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

类似的事情应该起作用:

您的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 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');
    }
}

这很粗糙,但应该可以指引您正确的方向。