Laravel 图片上传未保存到 public 文件夹

Laravel Image Upload not saving to public folder

我正在为这个图片上传系统而苦恼。 它应该上传一张将附加到 post 的图像(每个 post 有 1 张图像)。

一切似乎都工作正常,问题是当我检查数据库的图像路径时,我看到一个随机临时文件的路径,图像甚至没有上传到正确的文件夹中应用 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.');
}

UploadTrait.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;
    }

}

Create.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 itself

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

注意 Storage::disk('public') 指定 public 文件夹。

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

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

$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

谢谢大卫!我设法更正了保存到数据库的路径,但文件没有上传(即使数据库中的路径显示 /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.');
    }

在表格中输入

<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();

适合我!