namespace app\mobile\controller;
use app\common\controller\Base;
/**
@package app\api\controller 统一文件上传类
*/
class Upload extends Base
{
/**
@return [type] [description]
/
public function filesOne($max_filesize=8388608,$time=‘1‘,$size=‘348470‘,$max_filetime=‘30‘){
$type=Request()->param(‘type‘);
$files=$_FILES[‘fileName‘];
//var_dump($files);exit;
if (!empty($files)) {
if ($files[‘error‘] == 0) {
$ext = strtolower(pathinfo($files[‘name‘],PATHINFO_EXTENSION));
$imagesExt=[‘jpeg‘,‘png‘,‘jpg‘,‘gif‘];
$videosExt=[‘mp4‘,‘avi‘,‘wmv‘,‘video‘];
$audiosExt=[‘mp3‘,‘audio‘];
$imgpath=‘‘;
if(in_array($ext,$imagesExt)){
$path = ROOT_PATH . ‘public‘ . DS . ‘uploads‘.DS .‘image‘ .DS . $type . DS;
}elseif (in_array($ext,$videosExt)){
$path = ROOT_PATH . ‘public‘ . DS . ‘uploads‘.DS .‘video‘ .DS . $type . DS;
}elseif (in_array($ext,$audiosExt)){
$path = ROOT_PATH . ‘public‘ . DS . ‘uploads‘.DS .‘music‘ .DS . $type . DS;
}else{
$ret = returnArr(-1,‘‘,‘文件类型有误‘);
return json($ret);
}
if (!is_dir($path)){
mkdir($path,0777,true);
}
// 生成唯一的文件名
$fileName = md5(uniqid(microtime(true),true)).‘.‘.$ext;
// 将文件名拼接到指定的目录下
$destName = $path.$fileName;
if($files[‘size‘] <= $max_filesize){
// $file = move_uploaded_file($files[‘tmp_name‘], $path); //将临时文件转移至规定位置
if(in_array($ext,$videosExt)){
$coverName=md5(uniqid(microtime(true),true)).‘.jpg‘;
// ffmpeg -i E:\phpstudy_pro\WWW\weilv\public\uploads\video\1\142883ac94d5eb5820c4b13b9263a66ec.mp4 -ss 1 -f image2 E:\phpstudy_pro\WWW\weilv\public\uploads\video\1\d99496887efed5587683a3e5e877ff24.jpg
// $str = "ffmpeg -i " . $destName . " -y -f mjpeg -ss " . $time . " -t 0.001 -s $size " . $path . $coverName;
// $str = "ffmpeg -i ".$destName." -ss 1 -f image2 " .$path.$coverName;
$times=get_video_times($files[‘tmp_name‘]);//00:00:24
$seconds=getSeconds($times);//24
if($seconds > $max_filetime){ //时长判断
$ret = returnArr(-3,‘‘,‘上传的文件不能大于30秒‘);
return json($ret);
}
// 进行文件移动
if (!move_uploaded_file($files[‘tmp_name‘],$destName)){
$ret = returnArr(-2,‘‘,‘文件上传失败‘);
return json($ret);
}
$imgpath=get_img_by_video($destName, $path.$coverName,$size,$time);//截取视频第一秒第一帧
}
$msg = array(
‘code‘ => 1,
‘ext‘ => $ext,
‘path‘ => $destName,
‘filename‘=> $fileName,
‘coverName‘=> $imgpath,
‘time‘=> $seconds,
// ‘ctime‘=> $ctime,
);
$ret = returnArr(1,$msg,‘文件上传成功‘);
}elseif($files[‘size‘] > $max_filesize){
$ret = returnArr(-3,‘‘,‘上传的文件不能大于8M‘);
}else{
$ret = returnArr(-3,‘‘,‘上传文件异常‘);
}
}else{
$ret = returnArr(-3,‘‘,‘上传文件异常‘);
}
}else{
$ret = returnArr(-3,‘‘,‘上传文件异常‘);
}
return json($ret);
}
/**
}
/**
@return float|int
/
function getSeconds($string)
{
$arr = explode(‘:‘, $string);
$len = count($arr);
return (int)$arr[$len - 1] + (int)$arr[$len - 2] 60 + (($len > 2 ? (int)$arr[$len - 3] : 0) 60 60);
}
/**获取视频缩略图
$time : 截取第几帧为缩略图
*/
function get_img_by_video($videopath, $imgpath,$size, $time = 1,$ffempeg_path=‘E:\apizz\ffmpeg-20190202-6dc06e9-win32-shared\bin\ffmpeg.exe‘)
{
if (!file_exists($videopath)) return false;
if (strpos(PHP_OS, ‘WIN‘) !== false) { //windows系统
$str = "{$ffempeg_path} -i {$videopath} -y -f mjpeg -ss 3 -t {$time} -s {$size} {$imgpath}";
system($str);
return $imgpath;
}
}
/**
@param string $video_path [video的绝对路径]
*/
function get_video_times($video_path, $ffmpeg_path = ‘E:\apizz\ffmpeg-20190202-6dc06e9-win32-shared\bin\ffmpeg.exe‘)
{
if (!file_exists($video_path)){
$ret=returnArr(-1,‘‘,‘视频文件不存在‘);
return $ret;
} //return [‘status‘ => 0, ‘msg‘ => ‘视频文件不存在‘];
$times = false;
$commond = "{$ffmpeg_path} -i {$video_path} 2>&1";
exec($commond, $str_res, $str_r);
if (is_array($str_res)) {
foreach ($str_res as $v) {
if (strpos($v, ‘Duration‘) !== false) {
$times = substr($v, stripos($v, ‘.‘) - 8, 8);//‘ Duration: 00:24:28.14, start: 0.000000, bitrate: 486 kb/s‘
break;
}
}
}
// $ret= $times ? returnArr(1,$times,‘cg‘) :returnArr(1,‘‘,‘获取视频时间失败‘);
return $times;
//return $times ? [‘status‘ => 1, ‘msg‘ => $times] : [‘status‘ => 0, ‘msg‘ => ‘获取视频时间失败‘];
}
}
原文:https://blog.51cto.com/13346331/2454592