love_php/app/Http/Controllers/UploadController.php
2026-04-02 09:20:51 +08:00

367 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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('获取播放地址失败');
}
}
}
}