從零開始系列-Laravel編寫api服務介面:13.後端上傳七牛雲

lixueyuan發表於2021-05-18

簡介

laravel圖片上傳網上的程式碼太多了,下面貼一段我自己整理的圖片上傳,通過七牛雲上傳。
七牛上傳的包為:github.com/overtrue/laravel-filesy...

強烈建議檢視七牛雲的官方文件:developer.qiniu.com/kodo/sdk/php

提示:不應該由後端直接上傳檔案,應該 後端提供token,交給前端上傳!

下面是檔案上傳的公共方法:

if (!function_exists('base64_upload')) {
    /**
     * base64 檔案上傳,檔案路徑需要自己指定,但是檔案會按照月份存放在資料夾中
     *
     * @param string $content base64內容
     * @param string $path 儲存資料夾,例如輪播圖一般儲存在images/adv 裡面
     * @param string $file_name 檔名字
     * @param string $disk 磁碟名稱,預設使用public 磁碟,可被外界訪問
     * @param boolean $full_path 是否顯示完整路徑
     *
     * @return array|string 錯誤則返回陣列,否則返回地址
     */
    function base64_upload($content, $path = '/', $file_name = '', $disk = 'public', $full_path = false)
    {
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $content, $result)) {
            $type = $result[2];
            if (!in_array($type, ["png", "jpg", "gif", 'jpeg'])) {
                return [
                    'result' => false,
                    'msg'    => '圖片格式不正確,支援png, jpg, gif, jpeg',
                ];
            }
            // 新增月份資料夾
            if ($path === '/') $path = $path . '/' . date("Ym/d", time()) . '/';
            if (!$file_name) $file_name = create_guid() . '.' . $type;
            $storage = Storage::disk($disk);
            if ($storage->exists($path . $file_name)) { // 若存在相同的檔案則刪除原來的圖片地址即可
                $storage->delete($path . $file_name);
            }
            // 將base64檔案轉換為二進位制流圖片、base64圖片、二進位制圖片轉換見:https://blog.csdn.net/bt_xxx/article/details/94588358
            $bool = $storage->put($path . $file_name, base64_decode(str_replace($result[1], '', $content)));
            if ($bool) {
                $real_url = $full_path ? $storage->url($path . $file_name) : $path . $file_name;
                if (false === strpos($real_url, '?')) {
                    $real_url .= '?hash=' . create_guid();
                } else {
                    $real_url .= '&hash=' . create_guid();
                }
                return $real_url;
            }
        }
        return [
            'result' => false,
            'msg'    => '圖片資料不是base64格式',
        ];
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
程式設計兩年半,喜歡ctrl(唱、跳、rap、籃球)

相關文章