【问题标题】:How can I solve "Type error: Argument 2 passed to ... must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile"?如何解决“类型错误:传递给...的参数 2 必须是 Symfony\Component\HttpFoundation\File\UploadedFile 的实例”?
【发布时间】:2017-10-17 00:02:03
【问题描述】:

我的控制器是这样的:

public function store(CreateProductRequest $request)
{
    ...
    $result = $this->product_service->createProduct($param,$photo);
    ...
}

我的服务是这样的:

public function createProduct($param, UploadedFile $photo=null)
{
    dd($photo);
    if($photo) {
        $fileName = str_random(40) . '.' . $photo->guessClientExtension();
        $param['photo'] = $fileName;
        $param['photo_list'] = json_encode(['id'=>1,'name'=>$fileName]);
    }
    ...
    if(is_array($result) && count($result)>1 && $result[0])
        $this->savePhoto($photo, $fileName,$result[1]->id);
    ...
    return $result;
}

private function savePhoto(UploadedFile $photo, $fileName, $id)
{
    $destinationPath = public_path() . DIRECTORY_SEPARATOR . 'img'. DIRECTORY_SEPARATOR .'products'.DIRECTORY_SEPARATOR.$id;
    $photo->move($destinationPath, $fileName);
    resize_image($fileName,250,'products',$id);
    return $fileName;
}

Symfony\Component\HttpFoundation\File\UploadedFile 是这样的:https://pastebin.com/KLfnXZJV

当变量$photo不是数组或只有1个数据时,我做dd($photo);,它显示结果

但是当变量$photo是数组时,我做dd($photo);,存在错误:

类型错误:参数 2 传递给 App\Services\ProductService::createProduct() 必须是 Symfony\Component\HttpFoundation\File\UploadedFile,给定数组

我该如何解决这个问题?

【问题讨论】:

  • $photo 是在哪里定义的?您已提示 createProduct 方法类型,以便参数 必须UploadedFile 的实例。
  • @Jeremy Harris,它在控制器中定义。如果$photo 像这样:postimg.org/image/47t72locf,没有错误。但是$photo 像这样:postimg.org/image/58qo0i8u7,存在错误
  • 正如 Jeremy 所说,它必须是 UploadedFile 实例。能否提供更多控制器代码?
  • 我认为您正在尝试进行多重上传?如果是这样,那么在您的控制器中,您需要遍历该照片数组,并为每一张照片调用product_service->createProduct(..., ...)

标签: php laravel symfony upload laravel-5.3


【解决方案1】:

这里的问题是你要么得到一个文件,要么得到一个文件数组。创建产品是否支持上传多个文件?如果没有,你可以这样做:

// If file is inside an array, pull it out
if (is_array($photo) && $photo[0] instanceof UploadedFile) {
    $photo = $photo[0];
}

// Run upload
$result = $this->product_service->createProduct($param, $photo);

如果您需要能够上传多个文件,则需要执行一些操作。首先,您不能将您的方法键入为UploadedFile。相反,将其键入为数组:

public function createProduct($param, array $photos = [])

然后在您的createProduct 逻辑中,您将需要遍历照片数组并单独保存它们。

最后,在您的控制器中,您需要执行与第一个建议相反的操作,而不是从数组中提取 ,您需要将其放入一个数组中:

if ($photo instanceof UploadedFile) {
    $photo = [$photo];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多