love_php/app/Http/Controllers/UploadController.php

367 lines
14 KiB
PHP
Raw Normal View History

2026-04-02 09:20:51 +08:00
<?php
namespace App\Http\Controllers;
use App\Models\ApproveHistory;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Log;
use OSS\OssClient;
use App\Contracts\UserContract;
use App\Http\Response\ResponseJson;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
class UploadController extends Controller
{
use ResponseJson;
protected $userCon;
public function __construct(UserContract $userCon)
{
$this->userCon = $userCon;
}
public static function getOssClient()
{
try {
$ossClient = new OssClient(config('alioss.id'), config('alioss.secret'), config('alioss.host'));
} catch (\OSS\Core\OssException $e) {
return false;
}
return $ossClient;
}
//
public function upload(Request $request)
{
$file = $_FILES['fileData'];
//延时0.5秒,避免出现上传头像找不到图片问题
usleep(500000);
return $this->uploadFile($file);
}
/**
* 不需要登录就可以上传头像
* 上传完图片 进行图片检测
*/
public function uploadNotLogin(Request $request)
{
$file = $_FILES['fileData'];
//延时0.5秒,避免出现上传头像找不到图片问题
usleep(500000);
$url = $this->uploadFile($file);
$result = \CommonUtilsService::imageContentCecurity([$url]);
if ($result && isset($result['result']) && $result['result']) {
return $this->failure('图片异常',$result);
}else{
return $this->success('upload_ok',$url);
}
}
public function officialUpload(Request $request)
{
$param = array_filter($request->input());
$arr['zheng'] = $param['file_positive'];
$arr['fan'] = $param['file_side'];
$user = auth()->user();
$Afiles = [];
foreach ($arr as $k => $v) {
$Afiles[] = $v;
}
$user_id = $user->id;
$has_history = ApproveHistory::where('user_id', $user_id)->where('status', 0)->count();
if ($has_history) {
return $this->failure('已有待审核的认证');
}
$Ainfo = ApproveHistory::where('user_id', $user_id)->get()->toArray();
if (!empty($Ainfo)) {
if ($Ainfo[0]['status'] == 1) return $this->failure('已经认证,请不要重复提交!');
}
User::where('id', $user_id)->update(['identification_photos' => json_encode($Afiles, true)]);
$Acreate = [];
$Acreate['user_id'] = $user_id;
$Acreate['type'] = 'name';
$Acreate['status'] = 0;
if (!empty($Ainfo)) {
ApproveHistory::where('user_id', $user_id)->update(['status' => 0]);
} else {
ApproveHistory::create($Acreate);
}
return $this->success('upload_ok', array_values($Afiles));
}
public function saveIdCardPhoto($file)
{
//生成新二维码云端全URI
$object = date('Y') . date('m') . "/" . date('d') . "/" . $file['name'];
$file_url = 'https://' . config('alioss.picture_domain') . '/' . $object;
require_once base_path('vendor/aliyuncs/oss-sdk-php') . '/autoload.php';
//连接aliyun oss server
try {
$ossClient = new \OSS\OssClient(config('alioss.id'), config('alioss.secret'), config('alioss.host'));
} catch (\OSS\Core\OssException $e) {
return $this->failure('oss_connect_failure', $e->getMessage());
}
//上传图片到aliyun oss
try {
$result = $ossClient->uploadFile(config('alioss.buckets.picture'), $object, $file['tmp_name']);
} catch (\OSS\Core\OssException $e) {
return $this->failure('oss_put_failure', $e->getMessage());
}
return $file_url;
}
//上传文件 
public function uploadFile($file)
{
$type_arr = ['text/html', 'text/htm'];
if (in_array($file['type'], $type_arr)) return $this->failure('后缀名错误');
//生成新二维码云端全URI
$path = Request()->path ? Request()->path : date('Y') . date('m') . "/" . date('d');
$object = $path . "/" . $file['name'];
$file_url = 'https://' . config('alioss.picture_domain') . '/' . $object;
require_once base_path('vendor/aliyuncs/oss-sdk-php') . '/autoload.php';
//连接aliyun oss server
try {
$ossClient = new \OSS\OssClient(config('alioss.id'), config('alioss.secret'), config('alioss.host'));
} catch (\OSS\Core\OssException $e) {
return $this->failure('oss_connect_failure', $e->getMessage());
}
//上传图片到aliyun oss
try {
$result = $ossClient->uploadFile(config('alioss.buckets.picture'), $object, $file['tmp_name']);
} catch (\OSS\Core\OssException $e) {
return $this->failure('oss_put_failure', $e->getMessage());
}
//内容安全-图片
// $result = \CommonUtilsService::imageContentCecurity([$file_url]);
// if ($result && isset($result['result']) && $result['result']) {
// return $this->failure('图片' . $result['result'] . ',请换一张照片');
// }
return $this->success('upload_ok', $file_url);
}
public function uploadFiles(Request $request)
{
Log::info("上传文件");
$file_count = $request->input('file_count');
$files = [];
for ($i = 0; $i < $file_count; $i++) {
$files[] = $_FILES['file_' . $i];
}
try {
$ossClient = new \OSS\OssClient(config('alioss.id'), config('alioss.secret'), config('alioss.host'));
$index = 0;
$file_arr = [];
foreach ($files as $file) {
$object = date('Y') . date('m') . "/" . date('d') . "/" . $file['name'];
$file_url = 'https://' . config('alioss.picture_domain') . '/' . $object;
$file_arr[] = $file_url;
$result = $ossClient->uploadFile(config('alioss.buckets.picture'), $object, $file['tmp_name']);
$index++;
}
return $this->success('ok', $file_arr);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('上传文件失败');
}
}
//获取Web真传签名
public function aliyunSignature(Request $request)
{
try {
$id = config('alioss.id');
$key = config('alioss.secret');
$host = 'https://' . config('alioss.picture_domain');
// $host = 'https://ufutx-images.oss-accelerate.aliyuncs.com';
$now = time();
$expire = 60 * 30; //设置该policy超时时间是60s. 即这个policy过了这个有效时间将不能访问
$end = $now + $expire;
$expiration = $this->gmt_iso8601($end);
$dir = date('Y') . date('m') . "/" . date('d') . "/";
//最大文件大小.用户可以自己设置
$condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
$conditions[] = $condition;
//表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
$start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
$conditions[] = $start;
//这里默认设置是2020年.注意了,可以根据自己的逻辑,设定expire 时间.达到让前端定时到后面取signature的逻辑
$arr = array('expiration' => $expiration, 'conditions' => $conditions);
$policy = json_encode($arr);
$base64_policy = base64_encode($policy);
$string_to_sign = $base64_policy;
$signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));
$callback_url = $request->root() . '/api/upload';
$callback_param = array(
'callbackUrl' => $callback_url,
'callbackBody' => 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
'callbackBodyType' => "application/x-www-form-urlencoded"
);
$callback_string = json_encode($callback_param);
$base64_callback_body = base64_encode($callback_string);
$response = array();
$response['accessid'] = $id;
$response['host'] = $host;
$response['policy'] = $base64_policy;
$response['signature'] = $signature;
$response['expire'] = $end;
//这个参数是设置用户上传指定的前缀
$response['dir'] = $dir;
$response['picture_domain'] = config('alioss.picture_domain');
//$response['callback'] = $base64_callback_body;
return $this->success('aliyun_signature', $response);
} catch (\Exception $e) {
\Log::error($e->getMessage());
return $this->failure("上传失败");
}
}
//aliyun get signature using
private function gmt_iso8601($time)
{
$dtStr = date("c", $time);
$mydatetime = new \DateTime($dtStr);
$expiration = $mydatetime->format(\DateTime::ISO8601);
$pos = strpos($expiration, '+');
$expiration = substr($expiration, 0, $pos);
return $expiration . "Z";
}
public function createUploadVideo(Request $request)
{
\Log::info(env('ALIYUN_VOD_ACCESS_KEY_ID'));
try {
$mp3_arr = ['wma','wav','ogg'];
$mp4_arr = ['ma4','m4a','wmv','MOV','video/quicktime','mp4'];
$file_name = $request->input('file_name');
$cover_url = $request->input('cover_url');
if (empty($file_name)) throw new \Exception('缺少视频源文件名', 1);
$str = substr($file_name,strrpos($file_name,'.')+1);
$query = [
'query' => [
'RegionId' => "cn-hangzhou",
'Title' => $file_name,
'FileName' => $file_name,
'CoverURL' => $cover_url,
],
'headers' =>[
'referer' => 'http://love.ufutx.com'
]
];
if(in_array($str,$mp3_arr)){
$end = 'mp3';
$file_name = str_replace($str,$end,$file_name);
$query['query']['FileName'] = $file_name;
}
if(in_array($str,$mp4_arr)){
$end = 'mp4';
$file_name = str_replace($str,$end,$file_name);
$query['query']['FileName'] = $file_name;
//$query['query']['TemplateGroupId'] = '0945f5dd3a9372ce390cf41d6d35e96b';
}
AlibabaCloud::accessKeyClient(env('ALIYUN_VOD_ACCESS_KEY_ID'), env('ALIYUN_VOD_ACCESS_KEY_SECRET'))
->regionId('cn-hangzhou')
->asDefaultClient();
$result = AlibabaCloud::rpc()
->product('vod')
// ->scheme('https') // https | http
->version('2017-03-21')
->action('CreateUploadVideo')
->method('POST')
->host('vod.cn-shanghai.aliyuncs.com')
->options($query)
->request();
$result = $result->toArray();
return $this->success('ok', $result);
} catch (ClientException $e) {
$this->getError($e);
return $this->failure('视频上传失败,请稍后再试');
} catch (ServerException $e) {
$this->getError($e);
return $this->failure('视频上传失败,请稍后再试');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('视频上传失败,请稍后再试');
}
}
public function refreshUploadVideo(Request $request)
{
try {
$video_id = $request->input('video_id');
if (empty($video_id)) throw new \Exception("渠道视频id", 1);
AlibabaCloud::accessKeyClient(env('ALIYUN_VOD_ACCESS_KEY_ID'), env('ALIYUN_VOD_ACCESS_KEY_SECRET'))
->regionId('cn-hangzhou')
->asDefaultClient();
$result = AlibabaCloud::rpc()
->product('vod')
// ->scheme('https') // https | http
->version('2017-03-21')
->action('RefreshUploadVideo')
->method('POST')
->host('vod.cn-shanghai.aliyuncs.com')
->options([
'query' => [
'RegionId' => "cn-hangzhou",
'VideoId' => $video_id,
],
'headers' =>[
'referer' => 'http://lova.ufutx.com'
]
])
->request();
$result = $result->toArray();
return $this->success('ok', $result);
} catch (ClientException $e) {
$this->getError($e);
return $this->failure('视频上传失败,请稍后再试');
} catch (ServerException $e) {
$this->getError($e);
return $this->failure('视频上传失败,请稍后再试');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('视频上传失败,请稍后再试');
}
}
public function videoUrl(Request $request)
{
try {
$video_id = $request->input('aliyun_video_id');
if (empty($video_id)) return $this->failure('缺少视频id');
$result = \AliyunService::getPlayInfo($video_id, 'vod-mp.ufutx.com');
$play_url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL'];
$cover_url = $result['VideoBase']['CoverURL'] ?? '';
return $this->success('ok', compact('play_url', 'cover_url'));
} catch (\Exception $e) {
//$this->getError($e);
if($e->getCode() == 403){
return $this->jsonResponse(0,"视频审核中,请稍后重试");
}else{
return $this->failure('获取播放地址失败');
}
}
}
}