首页 > 解决方案 > 无法将文件存储在我的存储中 - laravel

问题描述

我正在尝试通过表单将一些文件上传到我的数据库以及我的项目的存储中

我在主页上做了以下代码:

<x-layout>

    @if (session('message'))
        <div class="alert alert-success">{{session('message')}}</div>
    @endif

    <div class="container vh-100">
        <div class="row h-100 w-100 align-items-center">
            <div class="offset-3 col-6">
                <form method="POST" action="{{route('transfer.submit')}}" class="card" enctype="multipart/form-data">
                    @csrf
                    <div class="border w-100" id="fileWrapper">
                        <div class="mb-3 w-100 h-100">
                            <input type="file" class="form-control w-100 h-100 fileInput" id="fileupload" name="files[]"  multiple >
                        </div>
                    </div>
                    <div class="mb-3">
                      <label for="exampleInputPassword1" class="form-label">Invia file a </label>
                      <input type="email" class="form-control" id="exampleInputPassword1" name="recipient_mail">
                    </div>
                    <div class="mb-3">
                        <label for="exampleInputPassword1" class="form-label">La tua mail</label>
                        <input type="email" class="form-control" id="exampleInputPassword1" name="sender_mail">
                      </div>
                    <div class="mb-3">
                      <input type="text" class="form-control" id="title" name="title">
                    </div>
                    <div class="mb-3">
                       <textarea name="message" cols="50" rows="10"></textarea>
                      </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
        </div>
    </div>
</x-layout>

然后我在我的模型中做了以下事情:

protected $fillable = [
        'recipient_mail',
        'sender_mail',
        'title',
        'message',
        'files[]'
    ];

以及我的控制器中的以下内容:

 public function transferSubmit(TransferRequest $request){
        
        $transfer = Transfer::create([
            'sender_mail'=>$request->input('sender_mail'),
            'recipient_mail'=>$request->input('recipient_mail'),
            'title'=>$request->input('title'),
            'message'=>$request->input('message'),
            'files'=>$request->file('files[]')->store('public/files'),
        ]);

        return redirect(route('home'))->with('message', 'File inviato con successo');
    }

我还创建了POST路线并完成了迁移,但是,当我尝试提交表单时,出现以下错误:

在 null 上调用成员函数 store() 时出错

在此之后,我尝试dd($request)ro 检查我实际传递给 Trasnfer 类的数据,我发现它正确接收了包括文件数组在内的所有数据。

有没有人可以帮助我理解为什么我会收到这个错误?

太感谢了

标签: phplaravellaravel-8

解决方案


您想要存储多个文件。你会得到一个数组。然后你必须像这样迭代你的文件数组。

$files = [];
if($request->hasfile('files[]'))
{
    foreach($request->file('files[]') as $file)
    {
        $files => $file->store('public/files'),
    }
}

重要提示: 在使用 Laravel 存储之前不要忘记符号链接。 php artisan storage:link

更新 您首先迭代,然后您拥有包含图像路径的文件数组。然后你可以将它传递给你的模型。

一点提示:来自表单的数据应始终进行验证。

 public function transferSubmit(TransferRequest $request){
   
    $files = [];
    if($request->hasfile('files[]'))
    {
        foreach($request->file('files[]') as $file)
        {
            $files => $file->store('public/files'),
        }
    }
     
        $transfer = Transfer::create([
            'sender_mail'=>$request->input('sender_mail'),
            'recipient_mail'=>$request->input('recipient_mail'),
            'title'=>$request->input('title'),
            'message'=>$request->input('message'),
            'files'=> $files;

        return redirect(route('home'))->with('message', 'File inviato con successo');
    }

推荐阅读