【问题标题】:Laravel Image Upload not saving to public folderLaravel 图片上传不保存到公共文件夹
【发布时间】:2020-05-20 20:07:51
【问题描述】:

我正在为这个图像上传系统而苦苦挣扎。 它应该上传一张将附加到帖子的图片(每个帖子都有一张图片)。

一切似乎都正常,问题是当我检查数据库的图像路径时,我看到一个随机临时文件的路径,并且图像甚至没有上传到应用程序 public 内的正确文件夹文件夹。

检查以下逻辑:

PostController.php

public function store(Request $request)
{
    $post = new Post;

    $request->validate([
        'title' => 'required',
        'description' => 'required',
        'slug' => 'required',
        'message' => 'required',
        'user' => 'required',
        'post_image' => 'image|mimes:jpeg,png,jpg,gif|max:2048'
        ]);

        if ($request->has('post_image')) {
            $image = $request->file('post_image');
            $name = Str::slug($request->input('title')).'_'.time();
            $folder = '/uploads/images/';
            $filePath = $folder . $name. '.' . $image->getClientOriginalExtension();
            $this->uploadOne($image, $folder, 'public', $name);
            $post->post_image = Storage::url($filePath);;
        }

    Post::create($request->all());

    return \Redirect::to('admin')->with('success','Great! Post created successfully.');
}

上传特征.php

trait UploadTrait
{
    public function uploadOne(UploadedFile $uploadedFile, $folder = null, $disk = 'public', $filename = null)
    {
        $name = !is_null($filename) ? $filename : Str::random(25);

        $file = $uploadedFile->storeAs($folder, $name.'.'.$uploadedFile->getClientOriginalExtension(), $disk);

        return $file;
    }
}

Post.php(模型)

    class Post extends Model
{
    protected $fillable = [
        'title',
        'description',
        'slug',
        'message',
        'user',
        'post_image'
       ];


    public function getImageAttribute(){
        return $this->post_image;
    }

}

创建.blade.php

<form action="{{ route('blog.store') }}" method="POST" name="add_post" role="form" enctype="multipart/form-data">
{{ csrf_field() }}

<h1>New Post</h1>
<div role="separator" class="dropdown-divider"></div> 

<div class="form-row">
    <div class="form-group col-12 col-md-6">
      <label for="title">Post Title</label>
      <input type="text" autocomplete="off" class="form-control" id="title" name="title" placeholder="Your post title" required>
      <span class="text-danger">{{ $errors->first('title') }}</span>
    </div>

    <div class="form-group col-12 col-md-6">
        <label for="slug">Slug</label>
      <input type="text" autocomplete="off" class="form-control" id="slug" name="slug" placeholder="Write post slug" required>
      <span class="text-danger">{{ $errors->first('slug') }}</span>
    </div>
</div>

<div class="form-row">
    <div class="form-group col-12 col-md-12">
        <label for="description">Post Description</label>
      <textarea class="form-control" id="description" name="description" placeholder="Enter a small description for your post" required></textarea>
      <span class="text-danger">{{ $errors->first('description') }}</span>
    </div>


</div>


    <div class="badge badge-warning badge-pill">Message</div>
    <div role="separator" class="dropdown-divider"></div>

 <div class="form-row">
    <div class="form-group col-md-12">
        <textarea class="form-control" col="4" id="message" name="message"></textarea>
        <span class="text-danger">{{ $errors->first('message') }}</span>
    </div>

</div>

<input type="hidden" value="{{ Auth::user()->name }}" name="user">

<input id="post_image" type="file" class="form-control" name="post_image">



  <button type="submit" class="btn btn-warning btn-block">Create Post</button>

</form>

感谢您的帮助!

问候, 蒂亚戈

【问题讨论】:

    标签: laravel image upload


    【解决方案1】:

    Laravel itself提供的功能可以直接使用

    $image_path = Storage::disk('public')->putFile('folders/inside/public', $request->file('post_image'));
    

    通知Storage::disk('public') 指定公用文件夹。

    然后您可以使用$request['image_path'] = $image_path 更新您的请求数组并像现在一样保存它,或者您不能仍然使用您的$post = new Post; 并设置每个输入数据像$post-&gt;title = $request-&gt;title; 然后像$post-&gt;save(); 一样保存

    【讨论】:

    • 嗨!感谢你的回复。这对我不起作用。相同的奇怪路径一直保存到数据库中。
    • @TiagoFilipe 注意到这个$request['image_path'] = $image_path 你有没有这样设置图像路径?或者您可以将 Post::create($request-&gt;all()); 替换为单独的行 $post-&gt;title = $request-&gt;title; $post-&gt;description = $request-&gt;description; 然后将您的实例化 Post 模型保存为 $post-&gt;save();
    • 检查您的文件系统配置文件。所有文件操作都与文件系统配置文件中定义的根目录相关。这可能是一个奇怪的地方
    • 请看下面我的问题。谢谢!
    • 我看到了你保存文件的问题,默认行为将文件保存到公共存储文件夹,你可以在storage/app/public找到你的文件
    【解决方案2】:

    您创建的帖子没有将图片路径保存在数据库中

    $post = new Post; //here you have created an empty Post object
    ...
    $post->post_image = Storage::url($filePath); //here you assigned the post_image to the empty object.
    
    Post::create($request->all());// here you create a new POST object with the request data, which does not contain the post_image
    

    【讨论】:

    • 嗨!感谢你的回复。如何将最终文件路径分配给要保存的信息?
    【解决方案3】:

    谢谢大卫!我设法更正了保存到数据库的路径,但文件没有上传(即使数据库中的路径显示/uploads/images/something.png,当我检查文件夹时,图像不存在..甚至没有上传文件夹。这是我现在根据您的建议采用的方法:

    public function store(Request $request)
        {
            $request->validate([
                'title' => 'required',
                'description' => 'required',
                'slug' => 'required',
                'message' => 'required',
                'user' => 'required',
                'post_image' => 'image|mimes:jpeg,png,jpg,gif|max:2048'
                ]);
    
                if ($request->has('post_image')) {
                    $image = $request->file('post_image');
                    $name = Str::slug($request->input('title')).'_'.time();
                    $folder = '/uploads/images';
                    $filePath = $folder . $name. '.' . $image->getClientOriginalExtension();
                    $this->uploadOne($image, $folder, 'public', $name);
                    $image_path = Storage::disk('public')->putFile('uploads/images', $request->file('post_image'));
                    $request['image_path'] = $image_path;
    
                }
    
                $post = new Post;
                $post->title = $request->title;
                $post->description = $request->description;
                $post->slug = $request->slug;
                $post->message = $request->message;
                $post->user = $request->user;
                $post->post_image = $request->image_path;
                $post->save();
    
            return \Redirect::to('admin')->with('success','Great! Post created successfully.');
        }
    

    【讨论】:

      【解决方案4】:

      表单输入

      <form method="POST" enctype="multipart/form-data" action="/url">
           <input id="category_logo" type="file" class="form-control"  name="category_logo">...
      

      控制器中的代码

      $category = Category::find($id);
      if($request->has('category_logo')) {
                      $image = $request->file('category_logo');
                      $category->category_logo = $image->getClientOriginalName();
                      $image->move(public_path('img/logo'), $image->getClientOriginalName());
                  }
                  $category->save();
      

      为我工作!

      【讨论】:

        猜你喜欢
        • 2019-01-27
        • 2018-05-03
        • 2018-03-24
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2014-02-19
        • 2016-07-02
        • 2017-07-26
        相关资源
        最近更新 更多