Laravel 5:无法显示上传的图像和文件权限

时间:2016-10-16 16:15:32

标签: laravel permissions upload unlink

在我的Laravel 5项目中,我将图像上传到公用文件夹的子文件夹中。示例:public / uploads / logos / imagename.jpg。图像上传成功但我有两个问题:

  1. 我无法使用<img src="uploads/logos/imagename.jpg">在视图中显示图片。错误表示找不到该文件。

  2. 使用以下代码删除图片时,我遇到了另一个文件权限问题:

    $ path =“uploads / logos / imagename.jpg”; if(file_exists($ path)){unlink($ path); }

  3. 请告知如何正确上传,删除上传的文件,并显示上传的图片。

    谢谢,Naren

1 个答案:

答案 0 :(得分:0)

有几个laravel和第三方功能可以为您解决此问题,为了更好的演示,让我们解决一个常见问题,上传用户头像:

您有以下表格:

<form method="POST" action="/avatar" accept-charset="UTF-8" enctype="multipart/form-data">
{{ csrf_field() }}
        <div>
           <input name="avatar" type="file">
        </div>
<div class="margin-top-10">
    <input type="submit" class="btn green" value="Submit" /> 
</div>

这是上传文件的表单,请注意您需要将accept-charsetenctype属性设置为文件字段与您的后端一起使用。在此之后,你必须让你的控制器上传头像,想象你有ProfileController类,就像这个动作一样:

public function set_profile_picture(Request $request) {
        $user = $request->user();
        if (!$request->hasFile('avatar')) {
            Flash::error('Avatar not found');
            return redirect('/profile');
        }
        $path = $request->file('avatar')->store('avatars');
        $user->avatar = $path;
    $user->save();
    return redirect('/profile');
}

检查您是否可以使用$request->file(avatar)从前端表单获取文件,完成后,您需要定义路由:Route::post('/avatar', 'Auth\\ProfileController@set_profile_picture');

最后,你需要做另一件事来展示上传的图片,你必须选择,将文件存储在服务器中是由Laravel中的Storage Facade制作的,所以,你会发现你无法公开访问这些文件,因为它们位于名为storage的文件夹中,您始终可以创建一个指向包含头像的文件夹的符号链接,以便在public文件夹中访问它们。前端控制器和所有这些东西,但是如果你使用像git这样的VCS,这个符号链接可能会在将来给你带来问题,最安全的方法是在你的控制器中定义另一个动作来访问存储中的私有文件,以下是更好的方法:

 Route::get('avatars/{filename}', function ($filename) {

   $path = storage_path() . '/app/avatars/' . $filename;
   if(!File::exists($path)) abort(404);

   $file = File::get($path);
   $type = File::mimeType($path);

   $response = Response::make($file, 200);
   $response->header("Content-Type", $type);

   return $response;
});

您可以在laravel官方文档中找到有关Storage Facade的更多信息,取消链接文件很简单\Storage::Delete('/path/to/file.jpg');

希望它可以帮助你这个小小的爆炸,最好! ;)