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 協議》,轉載必須註明作者和本文連結