Laravel 5.6将文件存储在数据库中并保存它们

时间:2018-12-03 09:31:30

标签: php laravel

创建新的ImageRequest时,用户可以上传1个或多个文件(例如图像)作为附件。

我的目标是将附件保存在数据库中或至少保存下来,以便我知道哪些附件属于什么ImageRequest。而且显然我需要保存文件。

这简化了我的ImageRequest表的外观:

Schema::create('image_requests', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('user_id')->nullable();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('attachment')->nullable();
        $table->timestamps();
});

这是我在表单中上传的文件。

<input
        id="input-b3"
        name="attachment[]"
        type="file"
        class="file"
        multiple
        data-show-upload="false"
        data-show-caption="true"
        data-msg-placeholder="Select {files} for upload..."
>

这是处理商店的逻辑:

private function createNewImageRequest(StoreImageRequestRequest $request)
{
    // create new imagerequest
    $imageRequest = new ImageRequest(
        array_merge(
            $request->all(),
            ['status' => self::STATUS_NEW]
        )
    );

    // save new image request binded to the user
    $imageRequest = Auth::user()->imageRequests()->save($imageRequest);

    // save files
    $request->file('attachment')->storeAs(
        'attachments', $request->user()->id
    );

    return $imageRequest->id;
}

我收到以下错误:

  

数组到字符串的转换

这可能是因为我的列类型是字符串,并且我正在尝试保存一个数组,所以我需要对其进行序列化,但是我不知道我在做什么或是否可以工作。

从来没有想到将附件存储在Laraven中会如此困难,特别是因为Laravel使Web应用程序的基本操作变得相当容易。

1 个答案:

答案 0 :(得分:0)

对于我的项目,我这样做并且在您的构造中起作用

   $this->upload_path = 'img'.DIRECTORY_SEPARATOR.'blog'.DIRECTORY_SEPARATOR;
    $this->storage = Storage::disk('public');

之后,在您的函数中使用以下代码:

 // Uploading Image
    if (array_key_exists('featured_image', $input)) {
        $this->deleteOldFile($blog);
        $input = $this->uploadImage($input);
    }

这是deleteOldFile

 public function deleteOldFile($model)
{
    $fileName = $model->featured_image;

    return $this->storage->delete($this->upload_path.$fileName);
}

和UploadImage

公共函数uploadImage($ input) {     $ avatar = $ input ['featured_image'];

if (isset($input['featured_image']) && !empty($input['featured_image'])) {
    $fileName = time().$avatar->getClientOriginalName();

    $this->storage->put($this->upload_path.$fileName, file_get_contents($avatar->getRealPath()));

    $input = array_merge($input, ['featured_image' => $fileName]);

    return $input;
}

}