即使文件存在,也会抛出Laravel FileNotFoundException

时间:2014-07-22 09:46:04

标签: php laravel laravel-4

我今天遇到了一个问题,我似乎无法找到解决方案。

我正在为图片上传创建一个类。上传本身工作正常,但当我尝试使用上传的文件创建缩略图时,由于某种原因无法找到该文件。

我的代码:

private static $imageTypes = [
    "image/jpeg", "image/png", "image/gif", "image/x-ms-bmp"
];

public function upload(UploadedFile $file, $folder = 'common')
{
    if (!$this->isImage($file)) {
        return false;
    }

    $path = $this->createPath($file, $folder);

    try {
        $file->move($path, $file->getClientOriginalName());
        $filePath = sprintf("%s/%s", $path, $file->getClientOriginalName());
    } catch (FileException $e) {
        return false;
    }

    $realPath = 'public/' . $filePath;
    //dd(File::exists($realPath)); - this returns false
    //dd(File::get($realPath)); - this throws the exception
    $image = Image::make(File::get($realPath));

    // Code for creating a thumbnail - not implemented yet.
    $thumbnailPath = '';

    return [
        'image' => $path,
        'thumbnail' => $thumbnailPath
    ];
}

private function isImage(UploadedFile $file)
{
    $type = $file->getClientMimeType();

    return in_array($type, self::$imageTypes);
}

private function createPath(UploadedFile $file, $folder)
{
    $time = Carbon::now();

    $path = sprintf(
        'Code/images/uploads/%s/%d-%d',
        $folder,
        $time->year,
        $time->month
    );

    return $path;
}

我知道该文件已上传,但我不知道为何无法找到该文件。我已使用php artisan tinker尝试了相同的操作,但它在那里工作,因此问题不在文件路径中。

我到目前为止唯一的想法是与目录权限相关,但我还没有能够验证它。

3 个答案:

答案 0 :(得分:4)

我相信你的问题在这里:$realPath = 'public/' . $filePath;。您需要上传文件夹的完整路径,因此请尝试将其替换为public_path()."/".$filePath

答案 1 :(得分:1)

我最近陷入同样的​​情况,所以这里有个提示

版本5之后的Laravel似乎仅允许使用在filesystems.php中定义的声明存储来处理文件(获取/放置)

在这种情况下,用户必须使用“本地”或“公共”存储来获取存储的图像或文件。 根据上面的代码,请执行以下操作

  1. 编辑 config / filesystems.php 查找本地并进行以下更改
'local' => [
   'driver' => 'local',
   'root' => storage_path('app/local/common'),
],
  1. 为了读取文件(即“ image1.jpg”)(获取)
$afile = storage::disk('public')->get('image1.jpg');

在您的情况下:

$realpath =  'image1.jpg'; //**Just the filename**
$image = Image::make(storage::disk('local')->get($realPath));

希望这会有所帮助

答案 2 :(得分:-4)

如果上述解决方案不起作用,请从文件中删除一个小代码,该文件可以在Path下面找到。

{{1}}

删除 staticof static

有关详细信息,请查看随附的屏幕截图。

enter image description here

希望它会有所帮助!!