intervention/image 伺服器圖片裁剪

毛仔發表於2018-11-21

1.拉取元件

composer require intervention/image

2.門面和服務提供者 config/app.php

// 服務提供者
'providers' => [  
    ...
    ...
 Intervention\Image\ImageServiceProvider::class,
],
// 門面
'aliases' => [  
    ... 
    ...
'Image'     => Intervention\Image\Facades\Image::class,  
],

上傳類例項(兄弟會大牛郭鵬超)

    <?php

namespace App\Services;
use Intervention\Image\Facades\Image;

/**
 * 圖片處理業務層
 *
 * Class UploadService
 * @package App\Services
 * @author 郭鵬超
 */
class UploadService
{
    protected static $qiNiuService = null;

    /**
     * 單例引入
     *
     * UploadService constructor.
     * @param QiNiuService $qiNiuService
     * @author 郭鵬超
     */
    public function __construct(QiNiuService $qiNiuService)
    {
        self::$qiNiuService = $qiNiuService;
    }
    /**
     * 圖片上傳介面
     *
     * @param $file
     * @return array
     * @author 郭鵬超
     */
   public function uploadFile($file)
    {
        // 檢查檔案是否上傳
        $check = $this->checkFile($file);
        // 驗證
        if ($check['ServerNo'] != 200) return $check;
        // 檔案儲存路徑
        $path = $this->path();
        // 重新命名
        $fileName = $this->reName($file->getClientOriginalExtension());
        // 移動
        if (!$file->move($path, $fileName)){
            return ['ServerNo' => 500, 'ResultData' => '檔案儲存失敗'];
        }
        return ['ServerNo' => 200, 'ResultData' => $fileName];
    }

    /**
     * 判斷上傳檔案是否可以上傳
     *
     * @param $file
     * @return array
     * @author 郭鵬超
     */
    private function checkFile($file)
    {
        // 檢查是否檔案上傳成功
        if (!$file->isValid()) {
           return ['ServerNo' => 404, 'ResultData' => '檔案上傳失敗'];
        }
        // 檢查是否超過檔案大小
        if ($file->getClientSize() > $file->getMaxFilesize()) {
            return ['ServerNo' => 404, 'ResultData' => '上傳檔案過大'];
        }
        return ['ServerNo' => 200, 'ResultData' => '檔案上傳成功'];
    }

    /**
     * 檔案重新命名
     *
     * @param $endname
     * @return string
     * @author 郭鵬超
     */
    private function reName($endname)
    {
        return md5($_SERVER['REQUEST_TIME'] . mt_rand(0,9999999)) . '.' . $endname;
    }

    /**檔案儲存位置
     *
     * @param $type
     * @return string
     * @author 郭鵬超
     */
    private function path()
    {
        return public_path('uploads');
    }

    /**
     * 處理頭像上傳
      *
     * @param $request
     * @return array
     * @author 郭鵬超
     */
    public function uploadPhoto($request)
    {
        // 檔名
        $name = 'avatar_file';
        // 檢查座標和檔案是否存在
        $data = $request->only('avatar_data');
        $file = $request->file($name);
        if (empty($data) || empty($file)) return ['ServerNo' => 404, 'ResultData' => '獲取資料失    敗'];

        // 上傳圖片操作,成功返回圖片上傳本地的路徑
        $result  = $this->uploadFile($file, $name);
        if ($result['ServerNo'] != 200) return $result;
        // 圖片路徑
        $path    = config('config.common.upload_path') . DIRECTORY_SEPARATOR;
        $file    = $result['ResultData'];        // 舊圖片路徑
        $newFile = config('config.common.photo_prefix') . $file;  // 新圖片路徑
        // 判斷圖片是否存在
        if (!file_exists($path . $file)) return ['ServerNo' => 404, 'ResultData' => '圖片不存在'];

        // 圖片裁剪
        $cutRes = $this->cutPhoto($data, $path . $file, $path . $newFile);
        if ($cutRes['ServerNo'] != 200) return $cutRes;

        // 上傳裁剪圖片到7牛
        $qiNiu = self::$qiNiuService->qiNiuUpload($newFile);

        // 檢查檔案是否上傳成功
        if ($qiNiu['ServerNo'] != 200) return $qiNiu;

        return ['ServerNo' => 200, 'ResultData' => $qiNiu['ResultData']];
    }

    /**
     * 進行圖片裁剪操作
     *
     * @param $data
     * @param $oldPath
     * @param $newPath
     * @return array
     * @author 郭鵬超
     */
    public function cutPhoto($data, $oldPath, $newPath)
    {
        // 獲取使用者對檔案進行處理的資料
        $avatarInfo  = json_decode($data['avatar_data']);
        $cropX  = floor($avatarInfo->x);
        $cropY  = floor($avatarInfo->y);
        $cropW  = floor($avatarInfo->width);
        $cropH  = floor($avatarInfo->height);
        $rotate = $avatarInfo->rotate;

        // 使用圖片處理類進行裁剪操作
        $img = Image::make($oldPath)
            ->rotate(-$rotate)
            ->crop($cropW, $cropH, $cropX, $cropY)
            ->save($newPath);

        // 生成裁剪圖片失敗
        if(!$img) return ['ServerNo' => 500, 'ResultData' => '圖片儲存失敗'];
        // 刪除舊圖片
        @unlink($oldPath);
        return ['ServerNo' => 200, 'ResultData' => $newPath];
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章