使用laravel上传图像并将URL存储在数据库中

时间:2019-03-05 10:44:32

标签: laravel image upload

我想上传多个图像并将其URL存储到数据库中。

这是我的代码:

<form method="POST" action="{{ route('validated', ['id' => $product->id]) }}) }}">
    @csrf
    <input type="hidden" name="ID" name="ID" value="{{ $product->id  }}">
    <div class="form-group row">
        <label for="Image" class="col-sm-2 col-form-label">Image</label>
        <img src="{{ $product->imageURL }}" />
    </div>
    <div class="form-group row">
        <div class="col-sm-12">
            <button type="submit" class="btn btn-lg btn-success">Valider les données</button> | <a href="#">Relancer le fournisseur</a>
        </div>
    </div>
</form>

并进入我的Controller函数:

$imagePath = Storage::putFile('uploads/image/', $request->image, "imagename");

我遇到此错误:

  

Symfony \ Component \ Debug \ Exception \ FatalThrowableError引发   消息“在字符串上调用成员函数hashName()”

     

Stacktrace:0中的Symfony \ Component \ Debug \ Exception \ FatalThrowableError   C:\ laragon \ www \ MyProject \ vendor \ laravel \ framework \ src \ Illuminate \ Filesystem \ FilesystemAdapter.php:208

5 个答案:

答案 0 :(得分:1)

如果您使用Laravel,则应该能够执行以下操作:

$imagePath = $request->file('image')->store('uploads/image');

或者,如果您想指定文件名,则可以执行以下操作:

$imagePath = $request->file('image')->storeAs('uploads/image', 'myfilename.jpg');

已更新

我注意到,在您的HTML表单中,您没有文件上传输入。如果您没有该文件,Laravel将不会存储文件。

答案 1 :(得分:1)

嗨,我认为您需要使用putFileAs方法来自定义名称,例如:

//Manually specify a file name...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

此方法接受Illuminate \ Http \ File或Illuminate \ Http \ UploadedFile实例,并将自动将文件流式传输到所需位置:

source

答案 2 :(得分:1)

要上传多张图片,您可以尝试以下代码

$images = $request->file('images');
foreach ($images as $key => $image) {

    if ($request->hasFile('images') && $request->file('images')[$key]->isValid()) {
        $urlPath = $request->images[$key]->store('public/images');

        $image = new Images();
        $image->path = $urlPath;
        $image->save();
    } else {
        return redirect()->back()->withInput()->with('errors', 'Invalid Image file found!');
    }
}

假定,您必须在表单中添加enctype="multipart/form-data",在函数参数中添加Request $request,还必须在公共目录中添加storage link

我希望这会有所帮助。谢谢

答案 3 :(得分:1)

首先,您要上传图片的表单必须具有enctype="multipart/form-data"属性。

基于Laravel documentation,您可以使用类似这样的内容:

$path = $request->file('image')->store('image');

答案 4 :(得分:1)

如果您想编写可重用的代码并以不同的方式使用它,请执行此操作

例如,我们有Post and Image模型 在图片模型中添加此代码

public function post()
    {
        return $this->belongsTo(Post::class);
    }
 public static function named($name,$type)
{
    $photo = new static;
    $photo->saveAs($name,$type);
    return $photo;
}
public function saveAs($name,$type)
{
    $this->path = sprintf("%s/%s/%s-%s",'baseDir',$type,time(), $name);
    $this->name = sprintf("%s-%s", time(), $name);
    $this->type = $type;
}
public function moves(UploadedFile $file,$type)
{
    $file->move($this->baseDir.'/'.$type, $this->name);
    return $this;
}

,并在您想要为其添加图像的模型中,例如Post:

    public function images()
    {
        return $this->hasMany(Image::class);
    }
     public function addImages(Image $image)
    {
        return $this->images()->save($image);
    }

和控制器中:

public function addImages(ImageRequest $request,$id)
 {
    $image = $this->makeImage($request->file('file'),$request->type);
    Post::where('id' ,'=', $id)->first()->addImage($image);
    return back();
 }

 protected function makeImage(UploadedFile $file,$type)
   {
     return Image::named($file->getClientOriginalName(),$type)->moves($file,$type);

   }