【问题标题】:How to save picture from a form and then display it to the view with Laravel?如何从表单中保存图片,然后使用 Laravel 将其显示到视图中?
【发布时间】:2021-02-07 06:38:28
【问题描述】:

我现在正在尝试的是,通过一个表单,我将保存一张图片(不在数据库中),但我不知道在哪个文件夹中(在存储中公开?到资产/img 文件夹中? )。

我的第二个问题是如何显示这张图片。

现在,我可以在storage/app/public 文件夹中保存一张图片,这是我的功能:

protected function saveFiles($idRecette, $file)
{
    $recette = Recette::where('id_recette',$idRecette)->firstOrFail();
    $path = 'documents/recettes/' . $idRecette . '/' . $recette->titre;
    $fileName = $idRecette.'-'.$recette->titre.'.'.$file->getClientOriginalExtension();
    $file->storeAs($path, $fileName);
}

现在,显示我的主页的功能:

public function accueil_recette(Request $request)
{
  $recette_ALL = Recette::orderBy('created_at', 'desc')->get();
  $data = array();
  foreach($recette_ALL as $recette){
     $path = 'documents/recettes/';
     $files = Storage::files($path.$recette->id_recette . '/' . $recette->titre);
     $absolute_path = storage_path('app/'.$files[0]);
     $data[$recette->id_recette] = $absolute_path;   
  }
  return view('admin/recette/admin_liste_recette', [
    'data' => $data
  ]);
}

在我看来

<img src="{{ $data[$recette->id_recette] }}" alt="" width="140" height="100">

然后,当我访问该站点并执行 inspect element 时,我有这个:

<img src="C:\xampp\htdocs\myproject\storage\app/documents/recettes/45/Test name/45-Test name.jpg">

如果我尝试将此路径放入文件夹,它将打开我的图片。

但是,我的页面上仍然没有显示图片...

【问题讨论】:

    标签: laravel


    【解决方案1】:

    storage_path 返回存储的绝对路径,您需要的是 \Storage::url 返回 URL

    但首先,通过运行以下 artisan 命令,确保您在 public 目录中拥有指向 storage/app/public 的符号链接:

    php artisan storage:link
    

    然后:

    public function accueil_recette(Request $request)
    {
      $recette_ALL = Recette::orderBy('created_at', 'desc')->get();
      $data = array();
      foreach($recette_ALL as $recette){
         $path = 'documents/recettes/';
         $files = Storage::files($path.$recette->id_recette . '/' . $recette->titre);
         
         //I changed storage_path to Storage::URL
         // Thus will give you `storage/documents/recettes/45/Test name/45-Test name.jpg`
         $data[$recette->id_recette] = \Storage::url($files[0]);   
      }
      return view('admin/recette/admin_liste_recette', [
        'data' => $data
      ]);
    }
    
    

    注意: 确保上传的文件/目录存在于storage/app/public 目录中

    示例: yourproject/storage/app/public/documents/recettes/45/Test name/45-Test name.jpg

    【讨论】:

    • 首先,感谢您的回答。当我做dd($data) 时,我有这个:array:1 [▼ 48 =&gt; "/storage/app/public/documents/recettes/48/test again"] 别的东西,路径内没有扩展名(png,jpg...)。所以视图中没有显示任何内容(我的视图中有这条路径/storage/app/public/documents/recettes/{$recette-&gt;id_recette}/{$recette-&gt;titre}。如果我用$path = 'app/public/documents/recettes/'.$recette-&gt;id_recette.'/'.$recette-&gt;titre; 替换它,我的视图中有这个:/storage/app/public/documents/recettes/49/aaaaaaaaa 仍然没有扩展名
    • 我更新了我的答案。 storage_path 返回完整路径,你需要的是 Storage::url
    • 我已经这样做了:$path = 'app/public/documents/recettes/'; $files = Storage::files($path.$recette-&gt;id_recette . '/' . $recette-&gt;titre); dd($files); $data[$recette-&gt;id_recette] = \Storage::url($files[0]); dd 返回一个空数组[] 并且错误是ErrorException Undefined offset: 0
    • 这是一个 pastebin,因为它在 cmets 中一团糟:pastebin.com/ttRgj9WJ
    • 我发现了它为什么不起作用。我放回$path = 'documents/recettes/'; 和它的工作。但是我的图片没有显示出来。我还在 mythis $data[$recette-&gt;id_recette] = Storage::url('app/'.$files[0]); 中添加了app/。在我看来,我有正确的路径/storage/app/documents/recettes/53/je test/53-je test.jpg,但仍然没有图片。由于它不在public 文件夹中,所以它不起作用,不是吗?我还在我的laravelProject 中做了php artisan storage:link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多