laravel中的圖片上傳封裝的工具類

<?php

namespace App\Handlers;

class ImageUploadHandler
{
    // 只允許以下後綴名的圖片文件上傳
    protected $allowed_ext = ["png", "jpg", "gif", 'jpeg'];

    /**
     * ($request->avatar, 'avatars', $user->id)
     * @param $file 圖片路徑
     * @param $folder 文件夾標識
     * @param $file_prefix  用戶ID
     * @return array|bool
     */
    public function save($file, $folder, $file_prefix)
    {
        // 構建存儲的文件夾規則,值如:uploads/images/avatars/201709/21/
        // 文件夾切割能讓查找效率更高。
        $folder_name = "uploads/images/$folder/" . date("Ym/d", time());

        // 文件具體存儲的物理路徑,`public_path()` 獲取的是 `public` 文件夾的物理路徑。
        // 值如:/home/vagrant/  Code/larabbs/public/uploads/images/avatars/201709/21/
        $upload_path = public_path() . '/' . $folder_name;

        // 獲取文件的後綴名,因圖片從剪貼板裏黏貼時後綴名爲空,所以此處確保後綴一直存在
        $extension = strtolower($file->getClientOriginalExtension()) ?: 'png';

        // 拼接文件名,加前綴是爲了增加辨析度,前綴可以是相關數據模型的 ID
        // 值如:1_1493521050_7BVc9v9ujP.png
        $filename = $file_prefix . '_' . time() . '_' . str_random(10) . '.' . $extension;

        // 如果上傳的不是圖片將終止操作
        if ( ! in_array($extension, $this->allowed_ext)) {
            return false;
        }


        // 將圖片移動到我們的目標存儲路徑中
        $file->move($upload_path, $filename);
        return [
            'path' => config('app.url') . "/$folder_name/$filename"
        ];
    }
}

接下來我們如何在控制器如何調用 首先我們在控制器引入use 工具類

use App\Handlers\ImageUploadHandler;
public function update(UserRequest $request,ImageUploadHandler $uploader, User $user)
    {
        if ($request->avatar) {
            $result = $uploader->save($request->avatar, 'avatars', $user->id);
            if ($result) {
                $data['avatar'] = $result['path'];
            }
        }
        $user->update($data);
        return redirect()->route('users.show', $user->id)->with('success', '個人資料更新成功!');
    }

$data返回圖片路徑http://china.org/uploads/images/avatars/201901/03/2_1546495195_MpjXsSvCQl.jpg

注意在.env中url配置當前項目的域名,默認是localhost

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章