【问题标题】:Laravel 5: Uploaded image can't be displayed and file permissionLaravel 5:上传的图片无法显示和文件权限
【发布时间】:2016-10-16 16:15:32
【问题描述】:

在我的 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); }

请指教如何正确上传,删除上传的文件,显示上传的图片。

谢谢,纳伦

【问题讨论】:

  • 试试<img src="{{ asset('uploads/logos/imagename.jpg') }}">
  • 而 #2 不起作用,因为您的文件不在 uploads 中。它位于public/uploads。也可以考虑使用适当的 Laravel 函数 File::delete('path')

标签: laravel permissions upload unlink


【解决方案1】:

有几个 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-&gt;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');

希望它能帮助你这个小小的解释,最好的! ;)

【讨论】:

  • 抱歉回复晚了,感谢您的建议。我只是意识到问题是因为我从 url 中删除了“public”,所以我确实将文件移动到了子文件夹“jobs”。然后我改变了 require DIR.'/jobs/bootstrap/autoload.php';和 $app = require_once DIR.'/jobs/bootstrap/app.php';在我的 index.php 文件中(在根目录中)。一切都很好,除了如何显示那些上传的图像。请就此提出建议
猜你喜欢
  • 1970-01-01
  • 2016-10-10
  • 2015-10-19
  • 2020-12-19
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多