【问题标题】:Laravel image upload to databaseLaravel 图片上传到数据库
【发布时间】:2020-12-07 17:04:33
【问题描述】:

这个函数是我用来存储新公司的函数:

public function store(Request $request)
{   

    $file = $request->file('logo');
    $filename = 'company-logo-' . time() . '.' . $file->getClientOriginalExtension();
    $path = $file->storeAs('public', $filename);
    dd($path);            

    Company::create([
        'name' => $request->name,
        'email' => $request->email,
        'logo' => $request->logo,
        'website' => $request->website
    ]);

    return redirect('/company/all');
}

这个视图是这样的:

@extends('layouts.app')

@section('content')
    <div class="card">
        <div class="card-body">
            <h4 class="card-title">Create a Company</h4>
        </div>

        <div class="container">
            <div class="jumbotron">
                <ul class="list-group">
                    <li class="list-group-item">
                        <h3>Enter Company Information:</h3>
                        <form action="{{ route('company.store') }}" enctype="mutlipart/form-data" method="POST">
                            @csrf
                            <div class="form-group">
                                <input type="text" class="form-control" name="name" placeholder="Company name" value="{{ old('name') }}">
                            </div>
                            <div class="form-group">
                                <input type="text" class="form-control" name="email" placeholder="Email" value="{{ old('email') }}">
                            </div>
                            <div class="form-group">
                                <input class="form-control" type="file" name="logo">
                            </div>
                            <div class="form-group">
                                <input class="form-control" type="url" name="website" placeholder="Website" value="{{ old('website') }}">
                            </div>
                            <button class="btn btn-primary" type="submit">Add Company</button>
                        </form>
                    </li>
                </ul>
            </div>
        </div>
    </div>
@endsection

这是路线:

Route::post('/add', 'CompaniesController@store')->name('store');

好吧,当我尝试提交此表单时会发生什么,$file 变量总是返回 null:

Error
Call to a member function getClientOriginalExtension() on null
http://localhost:8000/company/add

基本上我想做的是将图像的名称发送到数据库并将图像上传到我的公共文件夹。这段代码也不会发生。当我擦除从 $file 到 dd($path); 的部分时它将值添加到数据库中,但图像尚未上传。

有什么帮助吗?提前致谢。

【问题讨论】:

  • 路由中的“/company”是我在每条路由中都包含的前缀

标签: php mysql laravel forms laravel-filesystem


【解决方案1】:

尝试更改为:

public function store(Request $request)
{   

    $file = $request->file('logo');
    $path = '';
    if($file) {
        $filename = 'company-logo-' . time() . '.' . $file->getClientOriginalExtension();
        $path = $file->storeAs('public', $filename);
    }            

    Company::create([
        'name' => $request->name,
        'email' => $request->email,
        'logo' => $path,
        'website' => $request->website
    ]);

    return redirect('/company/all');
}

【讨论】:

  • 之前尝试过,它没有给我任何错误,但它不会将文件上传到我的公用文件夹它只是写入数据库的文件名。
  • 文件不在project_root/storage/app/public/ ?
  • 你提到的那个路径连接到我的公共文件夹,因为我使用了 php artisan storage:link 并且文件不会上传到它。
【解决方案2】:
  if (Input::hasFile('logo')) {
                $file = Input::file('logo');
                $ext = $file->getClientOriginalExtension();
                $file_name = 'company-logo-' . time() . ".{$ext}";
                $path = base_path().'/public/';
                $file->move($path , $file_name);
            }

【讨论】:

  • 使用 Illuminate\Support\Facades\Input;我用它来导入输入,但一直弹出一个错误,它不存在。
【解决方案3】:

首先表单上的属性是错误的enctype="mutlipart/form-data",应该是enctype="multipart/form-data"

或者您可以根据您的要求使用以下代码:

if($request->hasFile('logo')){
        $file = $request->file('logo');
        $fileName = 'company-logo-' .time().$file->getClientOriginalName();
        Storage::put('public/'.$fileName,file_get_contents($file));
        now you can store the $filename variable in database and image will be uploaded to storage/app/public folder
    }

请在文件顶部添加use Storage 并运行php artisan storage:link 以在存储文件夹和公用文件夹之间建立符号链接

【讨论】:

  • 文件已经链接了,问题是 $request->file('logo');返回空值。
  • @Ali 我已经更新了答案,请先检查我答案的前两行
  • 已检查。但这不是它
  • enctype="multipart/form-data 使用此属性,因为您输入错误该属性
  • 是的,我的意思是我检查并修复了它。我的错。但是还是不行。
【解决方案4】:

首先,您在表单中更改 enctype="multipart/form-data" 而不是 enctype="mutlipart/form-data"然后将此代码放入您的控制器

public function store(Request $request)
{
  if($request->hasFile('logo')) {
    $img_ext = $request->file('logo')->getClientOriginalExtension();
    $filename = 'company-logo-' . time() . '.' . $img_ext;
    $path = $request->file('logo')->move(public_path(), $filename);//image save public folder
  }
  //You should store only filename not path in db
  Company::create([
    'name' => $request->name,
    'email' => $request->email,
    'logo' => $filename, 
    'website' => $request->website
  ]);

    return redirect('/company/all');
}

【讨论】:

  • 不是这样的。请注意,IF 语句中的此条件始终为 false,并且 $request->file('logo') 返回 null。如果我能让它不返回 null 就可以解决了。
  • 您是否在表单中更改 enctype="multipart/form-data" 而不是 enctype="mutlipart/form-data"
  • 什么意思?你写了两个相同的语句。
  • 你写的是mutlipart,但是写错了,应该是multipart
  • 啊哈。仍然没有任何改善
【解决方案5】:

您可以使用文件池。核心库是用 vanilla JavaScript 编写的,因此可以在任何地方使用。 访问: https://pqina.nl/filepond/

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2013-12-25
    相关资源
    最近更新 更多