laravel livewire上传文件从path创建对象并保存到s3



我正在上传一个文件到一个文件上传组件,然后用一个事件将临时文件路径传递给父组件。在父组件中,我需要将文件保存到s3。

我需要将路径或文件对象或其他东西传递给父组件,然后保存它,但我似乎无法让它工作。

我已经尝试发送一个File对象,以及一个UploadedFile对象,我的最新迭代是尝试使用File对象,我得到以下错误:

Unresolvable dependency resolving [Parameter #0 [ <required> string $path ]] in class SymfonyComponentHttpFoundationFileFile

在我的子组件中我有这样的代码:

public function updatedFile()
{
$fileObj = new File($this->file->path());
$this->emitUp('fileUploaded', $fileObj);
}

在我的父组件中,我正在监听fileUploaded事件,它调用保存方法:

public function save(File $uploadedFile)
{
if ($path = Storage::putFileAs(env('APP_ENV') . '/statements', $uploadedFile->name, 's3')) {
$this->statement = new Statement([
'location_id'   => $this->location->id,
'file_name'     => $uploadedFile->name,
'path'          => $path,
'uploaded_by'   => Auth::user()->id,
]);
$this->statement->save();
}
}

我也试过使用$uploadedFile->storeAs(),我得到了同样的结果。似乎$uploadedFile对象不是正确的类型。我不知道我是否需要一个Storage对象或什么,我似乎无法在文档中找到一个好的答案。

我在livewire组件中上传文件后可用的路径是livewire在本地存储中保存文件的临时文件名。我还需要原始文件名,就像我保存到数据库时上传的文件名一样。

如果我删除save()方法上的类型提示,我得到Attempt to read property "name" on array。为什么$uploadedFile是一个数组而不是一个对象?如果我去掉类型提示它就会以数组的形式发送过来。我不知道. .

这是我想到的解决方案:

子组件:公共函数updatedFile(){$ this→验证(["文件"=比;"要求|马克斯:12288">

]);
$this->emitUp('fileUploaded', [$this->file->path(), $this->file->getClientOriginalName()]);
}

父组件:

public function save($uploadedFile)
{
if ($path = Storage::disk('s3')->put(env('APP_ENV') . '/statements/' . $uploadedFile[1], file_get_contents($uploadedFile[0]))) {
$this->statement = new Statement([
'location_id'   => $this->location->id,
'file_name'     => $uploadedFile[1],
'path'          => $path,
'uploaded_by'   => Auth::user()->id,
]);
$this->statement->save();
}
}

最新更新