| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | <?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Http\Services\Web\AiFaceService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Intervention\Image\ImageManagerStatic as Image;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\File;
use Log;
class AiFaceController extends Controller
{
    
    private $aiFaceSv;
    
    public function __construct()
    {
        $this->aiFaceSv = new AiFaceService();
    }
    // 人臉融合
    public function faceMerge(Request $request)
    {
        $preData = $request->all();
        $accessToken = '';
        $today = date("Y-m-d");
        
        $tokenData = $this->aiFaceSv->getTokenData();
        
        if (!isset($tokenData)) {
            
            $accessToken = $this->aiFaceSv->getAccessToken()->access_token;
            // \Log::info('1111 accessToken: '.$accessToken);
        
            $this->aiFaceSv->setTokenByDay($accessToken,'insert');
        } else if (isset($tokenData)&&($tokenData->updateDate!=$today)) {
            $accessToken = $this->aiFaceSv->getAccessToken()->access_token;
            // \Log::info('2222 accessToken: '.$accessToken);
            $this->aiFaceSv->setTokenByDay($accessToken,'update');
        } else {
            $accessToken = $tokenData->accessToken;
            // \Log::info('3333 accessToken: '.$accessToken);
        }
        // \Log::info('accessToken: '.$accessToken);
        $data = $this->aiFaceSv->getMergeData($accessToken, $preData);
        return response()->json($data);
    }
    
    // save string to db
    public function saveData(Request $request)
    {
        $title = $request->input('title', 'test title');
        $desc = $request->input('desc', 'test description');
        $shareId = $this->aiFaceSv->getShareId();
        $shareId += 1;
        $imageName = $shareId.'.jpg';
        $this->aiFaceSv->saveShareData($shareId, $title, $desc, $imageName);
        $data = [
            'id' => $shareId,
        ];
        return $data;
    }
    // save image to server
    public function saveImg(Request $request)
    {
        $id = $request->input('id', '');
        $imageO = $request->input('image', '');
        
        // \Log::info('imageO: '.$imageO);
        // \Log::info('id: '.$id);
        
        $s3Path = $this->savePhotoToS3($id, $imageO);
        // 儲存圖片並產生網址 - 儲存到 local
        
        if (!file_exists('faceMergeImg')) mkdir('faceMergeImg', 0777, true);
        $imageName = $id.'.jpg';
        $imgPath = public_path('faceMergeImg/' . $imageName);
        $imgObj = Image::make($imageO)->save($imgPath);
        $imgUrl = url('faceMergeImg/' . $imageName);
        // \Log::info('s3Path: '.$s3Path);
        $data = [
            'imgUrl' => $s3Path,
        ];
        return $data;
    }
    // get meta info from db to front
    public function getMeta(Request $request)
    {
        $id = $request->input('id', '');
        $kol = $request->input('kol', '');
        $shareData = $this->aiFaceSv->getShareData($id);
        // \Log::info($shareData);
        
        return view('shareToFacebook', [
            'webTitle' => $shareData['title'],
            'webDesc' => $shareData['desc'],
            'imagePath' => url('faceMergeImg/' . $shareData['imageName']),
            'kol' => $kol,
        ]);
    }
    /**
     * 儲存圖片到 S3
     */
    private function savePhotoToS3($id, $photo)
    {
        $folder = 'faceMergeImg';
        // \Log::info('folder: '.$folder);
        
        // 儲存路徑
        // 原圖
        $imgNameOrig = $id . '-orig.jpg';
        
        $imgPathOrig = public_path('faceMergeImg/' . $imgNameOrig);
        // 縮圖
        $imgName = str_replace('-orig', '', $imgNameOrig);
        $imgPath = str_replace('-orig', '', $imgPathOrig);
        // 暫存本機端
        $imgObj = Image::make($photo)->save($imgPath);
        
        // 儲存 S3
        $s3Path = Storage::disk('s3')->putFileAs($folder, new File($imgPath), $imgName);
        $s3Url = Storage::disk('s3')->url($s3Path);
        unlink($imgPath);
        // unlink($imgPathOrig);
        return $s3Url;
    }
    protected function validateInput($rules, $messages)
    {
        $result = true;
        $err_msg = "";
        $validate = Validator::make(request()->all(), $rules, $messages);
        if ($validate->fails()) {
            $result = false;
            $err = $validate->errors();
            foreach ($err->all() as $item) {
                $err_msg .= $item . "\n";
            }
        }
        return (object)[
            'result' => $result,
            'errMsg' => $err_msg
        ];
    }
    public function test()
    {
        return '123';
    }
}
 |