ImageController.php 5.6 KB
<?php

namespace App\Http\Controllers;

use App\Enums\Common\Code;
use App\Models\Image as ImageModel;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;

class ImageController
{
    public $upload_img = [
            //验证
            'rule' => [
                'size' => 3 * 1024 * 1024, //大小限制
                'ext' => 'jpeg,jpg,png,gif', //文件类型限制
            ],
            //生成文件规则
            'savename' => 'uniqid',
            //设置静态缓存参数(304)
            'header' => [
                'Cache-Control' => 'max-age=2592000',
                'Pragma' => 'cache',
                'Expires' => "%Expires%", // cache 1 month
                'etag' => "%etag%",
                'Last-Modified' => "%Last-Modified%",
                'Content-Description' => 'File Transfer',
            ],
            //图片保存根路径
            'path' => './uploads/images/',
            //图片上传变量名
            'name' => 'image',
    ];
    public $request = '';

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function index($hash = '', $w = 0 ,$h = 0){
        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
            header("HTTP/1.1 304 Not Modified");
            exit;
        }
        $imageModel = new ImageModel();
        $info = $imageModel->read(['hash'=>$hash]);
        if ($info === false) {
            $this->response('指定图片不存在!', 404);
        }
        //查看缩略图是否存在
        $filename = './../uploads/images/cache_'. $info['hash'] . $w . '_' . $h;
        if(is_file($filename)){
            $last_modified_time = gmdate(time() + ((30 * 60 * 60 * 24))) . " GMT";
            $header = str_replace(['%Expires%', "%etag%", '%Last-Modified%'],
                [$last_modified_time, $hash . ':' . $w . '_' . $h . '_' . 2, $last_modified_time], $this->upload_img['header']);
            $content = file_get_contents($filename);
            $header['Content-Length'] = $info['size'];
            return response($content, 200, $header);
        }
        $path = './../'.$info['path'];
        if (!is_file($path)) {
            $this->response('指定图片已被系统删除!', 404);
        }
        $content = '';
        $last_modified_time = gmdate(time() + ((30 * 60 * 60 * 24))) . " GMT";
        $header = str_replace(['%Expires%', "%etag%", '%Last-Modified%'],
            [$last_modified_time, $hash . ':' . $w . '_' . $h . '_' . 2, $last_modified_time], $this->upload_img['header']);
        if ($w > 0 && $h > 0) {
            $path = $this->cacheImage($info, $w, $h);
            $content = file_get_contents($path);
            $header['Content-Length'] = strlen($content);
        } else {
            $content = file_get_contents($path);
            $header['Content-Length'] = $info['size'];
        }
        $img_type = $info['type'];
        $content = base64_encode($content);
        $img_base64 = 'data:image/' . $img_type . ';base64,' . $content;
        return response($img_base64, 200, $header);
    }
    /**
     * 图片上传
     */
    public function upload() {
        $this->request->validate([
            'image'=>['required'],
        ],[
            'image.required'=>'图片必须填写',
        ]);
        $files = $this->request->file('image');
        if (empty($files)) {
            $this->response('没有上传的文件!', 400);
        }
        $type = $this->request->post('type', 'single');
        if ($type == 'multi') {
            return $this->multi($files);
        } else {
            return $this->single($files);
        }
    }
    /**
     * @name :上传图片
     * @return void
     * @author :liyuhang
     * @method
     */
    public function single($files){
        if (is_array($files)) {
            $file = current($files);
        }
        $url = './../uploads/images/';
        $filename = date('ymdHis').rand(10000,99999);
        $res = $files->move($url,$filename);
        if ($res === false) {
            return $this->fail($files->getError(), 400);
        }
        $data = [
            'path' => $url.$filename,
            'created_at' => date('Y-m-d H:i:s',time()),
            'size' => $res->getSize(),
            'hash' => $files->hashName(),
            'mime'=>$files->extension()
        ];
        $imageModel = new ImageModel();
        $imageModel->add($data);
        return $data['hash'];
    }
    /**
     * 生成缩略图缓存
     * @param type $info
     * @param type $w
     * @param type $h
     * @return string
     */
    private function cacheImage($info, $w, $h) {
        $path = './../'.$info['path'];
        $filename = './../uploads/images/cache_'. $info['hash'] . $w . '_' . $h;
        Image::make($path)->resize($w, $h)->save($filename);
        return $filename;
    }

    /**
     * @name 统一返回参数
     * @return JsonResponse
     * @author :liyuhang
     * @method
     */
    public function response($msg = null,string $code = Code::SUCCESS,$data = [],$result_code = 200,$type = 'application/json'): JsonResponse
    {
        $code = Code::fromValue($code);
        $result = [
            'msg' => $msg == ' ' ? $code->description : $msg,
            'code' => $code->value,
            'data' => $this->_extents($data),
        ];
        $this->header['Content-Type'] = $type;
        $this->header['token'] = $this->token;
        $response =  response($result,$result_code,$this->header);;
        throw new HttpResponseException($response);
    }
}