Files
ZangShiQi/app/model/upload/Upload.php
2026-04-04 17:27:12 +08:00

1197 lines
42 KiB
PHP
Executable File
Raw Permalink 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
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace app\model\upload;
use app\model\image\ImageService;
use extend\Upload as UploadExtend;
use Intervention\Image\ImageManagerStatic as Image;
use app\model\BaseModel;
class Upload extends BaseModel
{
public $upload_path = __UPLOAD__;//公共上传文件
public $config = []; //上传配置
public $site_id;
public $rule_type;//允许上传 mime类型
public $rule_ext;// 允许上传 文件后缀
public $path;//上传路径
public $ext = '';
public $driver = 'gd';
public $image_service;//图片类实例
public function __construct($site_id = 1, $app_module = 'shop')
{
$this->site_id = $site_id;
$config_model = new Config();
$config_result = $config_model->getUploadConfig(1, 'shop');
$this->config = $config_result[ "data" ][ "value" ];//上传配置
$this->driver = config('upload')[ 'driver' ] ?? 'gd';
$this->image_service = new ImageService($this->driver);
}
/************************************************************上传开始*********************************************/
/**
* 单图上传
* @param $param
* @return array|bool|mixed|\multitype|string
*/
public function image($param)
{
$check_res = $this->checkImg($param);
if ($check_res[ "code" ] >= 0) {
$file = request()->file($param[ "name" ]);
if (empty($file))
return $this->error();
$tmp_name = $file->getPathname();//获取上传缓存文件
$original_name = $file->getOriginalName();//文件原名
$file_path = $this->path;
// 检测目录
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0)
return $checkpath_result;
$file_name = $file_path . $this->createNewFileName();
$extend_name = $file->getOriginalExtension();
// $thumb_type = $param[ "thumb_type" ];
//原图保存
$new_file = $file_name . "." . $extend_name;
$image = $this->getImageService($tmp_name);
$width = $image->width;//图片宽
$height = $image->height;//图片高
if (!empty($param[ 'width' ]) && !empty($param[ 'height' ]) && $width != $param[ 'width' ] && $height != $param[ 'height' ]) {
return $this->error('', '图片尺寸限制为' . $param[ 'width' ] . ' x ' . $param[ 'height' ]);
} elseif (!empty($param[ 'width' ]) && $width != $param[ 'width' ]) {
return $this->error('', '图片尺寸宽度限制为' . $param[ 'width' ]);
} elseif (!empty($param[ 'height' ]) && $height != $param[ 'height' ]) {
return $this->error('', '图片尺寸高度限制为' . $param[ 'height' ]);
}
// $image->contrast(10);
// 是否需生成水印
if (isset($param[ 'watermark' ]) && $param[ 'watermark' ]) {
$image = $this->imageWater($image);
}
// 是否需上传到云存储
if (isset($param[ 'cloud' ]) && $param[ 'cloud' ]) {
$result = $this->imageCloud($image, $new_file, $file);
if ($result[ "code" ] < 0)
return $result;
} else {
try {
$image->save($new_file);
$result = $this->success($new_file, "UPLOAD_SUCCESS");
} catch (\Exception $e) {
return $this->error('', $e->getMessage());
}
}
// $thumb_res = $this->thumbBatch($tmp_name, $file_name, $extend_name, $thumb_type);//生成缩略图
// if ($thumb_res[ "code" ] < 0)
// return $result;
$data = array (
"pic_path" => $result[ "data" ],//图片云存储
"pic_name" => $original_name,
"file_ext" => $extend_name,
"pic_spec" => $width . "*" . $height,
"update_time" => time(),
"site_id" => $this->site_id
);
return $this->success($data, "UPLOAD_SUCCESS");
} else {
//返回错误信息
return $check_res;
}
}
public function getImageService($file, $option = [])
{
$driver = $option['driver'] ?? $this->driver;
if($driver != $this->driver){
$this->image_service = new ImageService($driver);
}
$image = $this->image_service->open($file);
return $image;
}
/**
* 相册图片上传
* @param $param
* @return array|bool|mixed|\multitype|string
*/
public function imageToAlbum($param)
{
$check_res = $this->checkImg($param);
if ($check_res[ "code" ] >= 0) {
$file = request()->file($param[ "name" ]);
if (empty($file))
return $this->error();
$tmp_name = $file->getPathname();//获取上传缓存文件
$original_name = $file->getOriginalName();//文件原名
$file_path = $this->path;
// 检测目录
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0)
return $checkpath_result;
$file_name = $file_path . $this->createNewFileName();
$extend_name = $file->getOriginalExtension();
$this->ext = $extend_name;
$thumb_type = $param[ "thumb_type" ];//所留
$album_id = $param[ "album_id" ];
$is_thumb = $param[ 'is_thumb' ] ?? 0;
$new_file = $file_name . "." . $extend_name;
$image = $this->getImageService($tmp_name);
$width = $image->width;//图片宽
$height = $image->height;//图片高
$result = $this->imageCloud($image, $new_file, $file);//原图云上传(文档流上传)
if ($result[ "code" ] < 0)
return $result;
if ($is_thumb == 1) {
$thumb_res = $this->thumbBatch($result[ 'data' ], $file_name, $extend_name, $thumb_type);//生成缩略图
if ($thumb_res[ "code" ] < 0)
return $result;
}
$pic_name = str_replace('.'.$extend_name, '', $original_name);
$data = array (
"pic_path" => $result[ "data" ],//图片云存储
"pic_name" => $pic_name,
"pic_spec" => $width . "*" . $height,
"update_time" => time(),
"site_id" => $this->site_id,
"album_id" => $album_id,
"is_thumb" => $is_thumb,
);
$album_model = new Album();
$res = $album_model->addAlbumPic($data);
if ($res[ 'code' ] >= 0) {
$data[ "id" ] = $res[ "data" ];
return $this->success($data, "UPLOAD_SUCCESS");
} else {
return $this->error($res);
}
} else {
//返回错误信息
return $check_res;
}
}
/*
* 替换图片文件
* */
public function modifyFile($param)
{
// 参数校验
if (empty($param[ 'album_id' ])) {
return $this->error('', "PARAMETER_ERROR");
}
if (empty($param[ 'pic_id' ])) {
return $this->error('', "PARAMETER_ERROR");
}
if (empty($param[ 'filename' ])) {
return $this->error('', "PARAMETER_ERROR");
}
if (empty($param[ 'suffix' ])) {
return $this->error('', "PARAMETER_ERROR");
}
$check_res = $this->checkImg($param);
if ($check_res[ "code" ] >= 0) {
$file = request()->file($param[ "name" ]);
if (empty($file))
return $this->error();
$tmp_name = $file->getPathname();//获取上传缓存文件
$original_name = $file->getOriginalName();//文件原名
$file_path = $this->path;
// 检测目录
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0) {
return $checkpath_result;
}
// 保留原文件名和后缀
$file_name = $file_path . $param[ 'filename' ];
$extend_name = $param[ 'suffix' ];
$thumb_type = $param[ "thumb_type" ];//所留
//原图保存
$new_file = $file_name . "." . $extend_name;
$image = $this->getImageService($tmp_name);
$width = $image->width;//图片宽
$height = $image->height;//图片高
// $image = $this->imageWater($image);
$result = $this->imageCloud($image, $new_file, $file);//原图云上传(文档流上传)
if ($result[ "code" ] < 0) {
return $result;
}
$thumb_res = $this->thumbBatch($tmp_name, $file_name, $extend_name, $thumb_type);//生成缩略图
if ($thumb_res[ "code" ] < 0) {
return $thumb_res;
}
$pic_name_first = substr(strrchr($original_name, '.'), 1);
$pic_name = basename($original_name, "." . $pic_name_first);
$data = array (
"pic_path" => $result[ "data" ],//图片云存储
"pic_spec" => $width . "*" . $height,
"update_time" => time(),
);
$album_model = new Album();
$condition = array (
[ "pic_id", "=", $param[ 'pic_id' ] ],
[ "site_id", "=", $this->site_id ],
[ 'album_id', "=", $param[ 'album_id' ] ],
);
$res = $album_model->editAlbumPic($data, $condition);
if ($res[ 'code' ] >= 0) {
$data[ "id" ] = $res[ "data" ];
return $this->success($data, "UPLOAD_SUCCESS");
} else {
return $this->error($res);
}
} else {
//返回错误信息
return $check_res;
}
}
/**
* 视频上传
* @param $param
* @return array
*/
public function videoToAlbum($param)
{
$check_res = $this->checkVideo();
if ($check_res[ "code" ] >= 0) {
// 获取表单上传文件
$file = request()->file($param[ "name" ]);
try {
$extend_name = $file->getOriginalExtension();
$new_name = $this->createNewFileName() . "." . $extend_name;
$original_name = $file->getOriginalName();//文件原名
$file_path = $this->path;
\think\facade\Filesystem::disk('public')->putFileAs($file_path, $file, $new_name);
$file_name = $file_path . $new_name;
$result = $this->fileCloud($file_name);
$pic_name_first = substr(strrchr($original_name, '.'), 1);
$pic_name = basename($original_name, "." . $pic_name_first);
$data = array (
"pic_path" => $result[ "data" ],//图片云存储
"pic_name" => $pic_name,
"pic_spec" => '',
"update_time" => time(),
"site_id" => $this->site_id,
"album_id" => $param[ 'album_id' ],
"is_thumb" => 0,
);
$album_model = new Album();
$res = $album_model->addAlbumPic($data);
if ($res[ 'code' ] >= 0) {
$data[ "id" ] = $res[ "data" ];
return $this->success($data, "UPLOAD_SUCCESS");
} else {
return $this->error($res);
}
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
} else {
return $check_res;
}
}
/**
* 视频上传
* @param $param
* @return array
*/
public function video($param)
{
$check_res = $this->checkVideo();
if ($check_res[ "code" ] >= 0) {
// 获取表单上传文件
$file = request()->file($param[ "name" ]);
try {
$extend_name = $file->getOriginalExtension();
$new_name = $this->createNewFileName() . "." . $extend_name;
$file_path = $this->path;
\think\facade\Filesystem::disk('public')->putFileAs($file_path, $file, $new_name);
$file_name = $file_path . $new_name;
$result = $this->fileCloud($file_name);
return $this->success([ "path" => $result[ 'data' ] ?? '' ], "UPLOAD_SUCCESS");
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
} else {
return $check_res;
}
}
/*
* 替换视频文件
* */
public function modifyVideoFile($param)
{
// 参数校验
if (empty($param[ 'album_id' ])) {
return $this->error('', "PARAMETER_ERROR");
}
if (empty($param[ 'pic_id' ])) {
return $this->error('', "PARAMETER_ERROR");
}
$check_res = $this->checkVideo();
if ($check_res[ "code" ] >= 0) {
$file = request()->file($param[ "name" ]);
if (empty($file))
return $this->error();
$extend_name = $file->getOriginalExtension();
$new_name = $this->createNewFileName() . "." . $extend_name;
$original_name = $file->getOriginalName();//文件原名
$file_path = $this->path;
// 检测目录
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0) {
return $checkpath_result;
}
\think\facade\Filesystem::disk('public')->putFileAs($file_path, $file, $new_name);
$file_name = $file_path . $new_name;
$result = $this->fileCloud($file_name);
$pic_name_first = substr(strrchr($original_name, '.'), 1);
$pic_name = basename($original_name, "." . $pic_name_first);
$data = array (
"pic_path" => $result[ "data" ],//图片云存储
"update_time" => time(),
);
$album_model = new Album();
$condition = array (
[ "pic_id", "=", $param[ 'pic_id' ] ],
[ "site_id", "=", $this->site_id ],
[ 'album_id', "=", $param[ 'album_id' ] ],
);
$res = $album_model->editAlbumPic($data, $condition);
if ($res[ 'code' ] >= 0) {
$data[ "id" ] = $res[ "data" ];
return $this->success($data, "UPLOAD_SUCCESS");
} else {
return $this->error($res);
}
} else {
//返回错误信息
return $check_res;
}
}
/**
* 上传文件
* @param $param
* @return array|\multitype
*/
public function file($param)
{
$check_res = $this->checkFile();
if ($check_res[ "code" ] >= 0) {
// 获取表单上传文件
$file = request()->file($param[ "name" ]);
try {
$extend_name = $file->getOriginalExtension();
if (!empty($param[ 'extend_type' ])) {
if (!in_array($extend_name, $param[ 'extend_type' ])) {
return $this->error([], 'UPLOAD_TYPE_ERROR');
}
}
$new_name = $this->createNewFileName() . "." . $extend_name;
$file_path = $this->path;
\think\facade\Filesystem::disk('public')->putFileAs($file_path, $file, $new_name);
$file_name = $file_path . $new_name;
return $this->success([ "path" => $file_name, 'name' => $new_name ], "UPLOAD_SUCCESS");
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
} else {
return $check_res;
}
}
/**
* 域名校验文件
*/
public function domainCheckFile($param)
{
$check_res = $this->checkFile();
if ($check_res[ "code" ] >= 0) {
// 获取表单上传文件
$file = request()->file($param[ "name" ]);
try {
$file_name = $file->getOriginalName();
$file_path = '';
\think\facade\Filesystem::disk('public')->putFileAs($file_path, $file, $file_name);
$file_name = $file_path . $file_name;
return $this->success([ "path" => $file_name ], "UPLOAD_SUCCESS");
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
} else {
return $check_res;
}
}
/************************************************************上传结束*********************************************/
/************************************************************上传功能组件******************************************/
/**
* 缩略图生成
* @param $file_path
* @param $file_name
* @param $extend_name
* @param array $thumb_type
* @return multitype|array
*/
public function thumbBatch($file_path, $file_name, $extend_name, $thumb_type = [])
{
$thumb_type_array = array (
"BIG" => array (
"size" => "BIG",
"width" => $this->config[ "thumb" ][ "thumb_big_width" ],
"height" => $this->config[ "thumb" ][ "thumb_big_height" ],
"thumb_name" => ""
),
"MID" => array (
"size" => "MID",
"width" => $this->config[ "thumb" ][ "thumb_mid_width" ],
"height" => $this->config[ "thumb" ][ "thumb_mid_height" ],
"thumb_name" => ""
),
"SMALL" => array (
"size" => "SMALL",
"width" => $this->config[ "thumb" ][ "thumb_small_width" ],
"height" => $this->config[ "thumb" ][ "thumb_small_height" ],
"thumb_name" => ""
)
);
foreach ($thumb_type_array as $k => $v) {
if (!empty($thumb_type) && in_array($k, $thumb_type)) {
$new_path_name = $file_name . "_" . $v[ "size" ] . "." . $extend_name;
$result = $this->imageThumb($file_path, $new_path_name, $v[ "width" ], $v[ "height" ], $v[ "size" ] != 'BIG' ? 'center' : '');
//返回生成的缩略图路径
if ($result[ "code" ] >= 0) {
$thumb_type_array[ $k ][ "thumb_name" ] = $new_path_name;
} else {
return $result;
}
}
}
return $this->success($thumb_type_array);
}
/**
* 缩略图
* @param $file
* @param $thumb_name
* @param unknown $width
* @param unknown $height
* @param string $fit
* @return multitype:boolean unknown |multitype:boolean
*/
public function imageThumb($file, $thumb_name, $width, $height, $fit = 'center')
{
set_time_limit(0);
//设置内存
ini_set('memory_limit', '1024M');
if (strtolower(pathinfo($file, PATHINFO_EXTENSION)) == 'gif' && extension_loaded('imagick')) {
$image =$this->getImageService($file, ['driver' => 'imagick']);
}else{
$image =$this->getImageService($file);
}
$image = $image->thumb($width, $height, $fit);
$image = $this->imageWater($image);
$result = $this->imageCloud($image, $thumb_name);
return $result;
}
/**
* 添加水印
*/
public function imageWater($image)
{
//判断是否有水印(具体走配置)
if ($this->config[ "water" ][ "is_watermark" ]) {
switch ( $this->config[ "water" ][ "watermark_type" ] ) {
case "1"://图片水印
if (!empty($this->config[ "water" ][ "watermark_source" ]) && is_file($this->config[ "water" ][ "watermark_source" ])) {
$water_path = $this->config[ "water" ][ "watermark_source" ];
$water_opacity = empty($this->config[ "water" ][ "watermark_opacity" ]) ? 0 : $this->config[ "water" ][ "watermark_opacity" ];
$water_rotate = empty($this->config[ "water" ][ "watermark_rotate" ]) ? 0 : $this->config[ "water" ][ "watermark_rotate" ];
$water_percent = empty($this->config[ "water" ][ "watermark_percent" ]) ? 20 : $this->config[ "water" ][ "watermark_percent" ];
$water_position = $this->config[ "water" ][ "watermark_position" ];
$water_x = $this->config[ "water" ][ "watermark_x" ];
$water_y = $this->config[ "water" ][ "watermark_y" ];
$image = $image->imageWater($water_path, $water_opacity, $water_rotate, $water_position, $water_x, $water_y, $water_percent);
}
break;
case "2"://文字水印
if (!empty($this->config[ "water" ][ "watermark_text" ])) {
$text = $this->config[ "water" ][ "watermark_text" ];
$x = $this->config[ "water" ][ "watermark_x" ];
if(empty($x)){
$x = 0;
}
$y = $this->config[ "water" ][ "watermark_y" ];
if(empty($y)){
$y = 0;
}
$size = $this->config[ "water" ][ "watermark_text_size" ];
if(empty($size)){
$size = 12;
}
$color = $this->config[ "water" ][ "watermark_text_color" ];
$align = $this->config[ "water" ][ "watermark_text_align" ];
$valign = $this->config[ "water" ][ "watermark_text_valign" ];
$angle = $this->config[ "water" ][ "watermark_text_angle" ];
if(empty($angle)){
$angle = 0;
}
$image = $image->textWater($text, $x, $y, $size, $color, $align, $valign, $angle);
}
break;
}
}
return $image;
}
public function to_unicode($string)
{
$str = mb_convert_encoding($string, 'gb2312', 'UTF-8');
$arrstr = str_split($str, 2);
$unistr = '';
foreach ($arrstr as $n) {
$dec = hexdec(bin2hex($n));
$unistr .= '&#' . $dec . ';';
}
return $unistr;
}
/**
* 删除文件
* @param $file_name
* @return array
*/
public function deleteFile($file_name)
{
if (file_exists($file_name)) {
$res = @unlink($file_name);
if ($res) {
return $this->success();
} else {
return $this->error();
}
}
return $this->success();
}
/**
* 图片云上传中转
* @param $image_class
* @param $file
* @param string $tmp_file
* @return array|mixed|string
*/
public function imageCloud($image_class, $file, $tmp_file = '')
{
try {
$compress_array = array (
'original' => null,
'large' => 90,
'medium' => 75,
'small' => 55,
);
$compress = $this->config[ 'upload' ][ 'compress' ] ?? 'original';
if ($compress == 'original' && !empty($tmp_file)) {
\think\facade\Filesystem::disk('public')->putFileAs('', $tmp_file, $file);
} else {
$compress = $compress_array[ $this->config[ 'upload' ][ 'compress' ] ?? 'original' ];
$image_class->save($file, $compress);
}
$result = $this->fileCloud($file);
//云上传没有成功 保存到本地
return $result;
} catch (\Exception $e) {
return $this->error('', $e->getMessage());
}
}
/**
* 云上传
*/
public function fileCloud($file)
{
try {
//走 云上传
$put_result = event("Put", [ "file_path" => $file, "key" => $file ], true);
if (!empty($put_result)) {
if ($put_result[ "code" ] >= 0) {
$this->deleteFile($file);
$file = $put_result[ "data" ][ "path" ];
} else {
return $put_result;
}
}
//云上传没有成功 保存到本地
return $this->success($file, "UPLOAD_SUCCESS");
} catch (\Exception $e) {
return $this->error('', $e->getMessage());
}
}
/**
* 图片验证
* @param $file
*/
public function checkImg($param)
{
try {
$file = request()->file();
$rule_array = [];
$size_rule = $this->config[ 'upload' ][ 'max_filesize' ];
$ext_rule = 'jpg,jpeg,png,gif,pem,webp';
$mime_rule = 'image/webp,image/jpg,image/jpeg,image/gif,image/png,text/plain';
if (!empty($size_rule)) {
$rule_array[] = "fileSize:{$size_rule}";
}
if (!empty($ext_rule)) {
$rule_array[] = "fileExt:{$ext_rule}";
}
if (!empty($mime_rule)) {
$rule_array[] = "fileMime:{$mime_rule}";
}
if (!empty($rule_array)) {
$rule = implode('|', $rule_array);
$file_name = array_keys($file)[0];
validate([ $file_name => $rule ])->check($file);
}
//要限制图片的宽高太大gd库会报错
if($this->driver == 'gd'){
$file = request()->file($param[ "name" ]);
$tmp_name = $file->getPathname();//获取上传缓存文件
$size_info = getimagesize($tmp_name);
$current_memory_limit = ini_get('memory_limit');
$current_memory_limit_bytes = $this->returnBytes($current_memory_limit);
$current_allow_max_size = $current_memory_limit_bytes/2.5/4;
if($size_info[0]*$size_info[1] > $current_allow_max_size){
$max_width = floor(sqrt($current_allow_max_size));
$max_size = $max_width.'*'.$max_width;
return $this->error([
'error_code' => 'UPLOAD_IMAGE_SIZE_EXCEED_FOR_GD_DRIVER',
'max_size' => $max_size,
], '图片像素太高,不要超出'.$max_size);
}
}
//获取上传图片的类型,gif图片大小限制2m
$file = request()->file($param[ "name" ]);
$file_type = $file->getMime();
if($file_type == 'image/gif' && $file->getSize() > 2097152){
return $this->error([
'error_code' => 'UPLOAD_IMAGE_SIZE_EXCEED',
'max_size' => '2M',
], 'GIF图片大小不能超过2M');
}
return $this->success();
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
}
public function returnBytes($val)
{
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
$val = (int)$val;
switch($last) {
case 'g':
$val *= 1024*1024*1024;
break;
case 'm':
$val *= 1024*1024;
break;
case 'k':
$val *= 1024;
break;
}
return $val;
}
/**
* 文件验证
* @param $file
* @return \multitype
*/
public function checkFile()
{
try {
$file = request()->file();
$suffix = pathinfo($_FILES[ 'file' ][ 'name' ], PATHINFO_EXTENSION);
if ($suffix == "pem" || $suffix == "crt") {
return $this->success();
}
$rule_array = [];
$size_rule = '';
$ext_rule = "txt,xlsx,xls,csv,pem";
$mime_rule = "text/plain,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,text/csv";
if (!empty($size_rule)) {
$rule_array[] = "fileSize:{$size_rule}";
}
if (!empty($ext_rule)) {
$rule_array[] = "fileExt:{$ext_rule}";
}
if (!empty($mime_rule)) {
$rule_array[] = "fileMime:{$mime_rule}";
}
$rule = implode("|", $rule_array);
$file_name = array_keys($file)[0];
$res = validate([ $file_name => $rule ])->check($file);
if ($res) {
return $this->success();
} else {
return $this->error();
}
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
}
/************************************************************上传功能组件******************************************/
public function checkVideo()
{
try {
$file = request()->file();
$rule_array = [];
$size_rule = '';
$ext_rule = "mp4,avi";
$mime_rule = "video/mp4,video/x-msvideo";
if (!empty($size_rule)) {
$rule_array[] = "fileSize:{$size_rule}";
}
if (!empty($ext_rule)) {
$rule_array[] = "fileExt:{$ext_rule}";
}
if (!empty($mime_rule)) {
$rule_array[] = "fileMime:{$mime_rule}";
}
$rule = implode("|", $rule_array);
$file_name = array_keys($file)[0];
$res = validate([ $file_name => $rule ])->check($file);
if ($res) {
return $this->success();
} else {
return $this->error();
}
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
}
/**
*获取一个新文件名
*/
public function createNewFileName()
{
$name = date('Ymdhis', time())
. sprintf('%03d', microtime(true) * 1000)
. sprintf('%02d', mt_rand(10, 99));
return $name;
}
/**
* 验证目录是否可写
* @param unknown $path
* @return boolean
*/
public function checkPath($path)
{
if (file_exists($path) || mkdir($path, 0755, true)) {
return $this->success();
}
return $this->error('', "上传目录 {$path} 创建失败,请检测权限");
}
/**
* 设置上传目录
* @param $path
* @return Upload
*/
public function setPath($path)
{
if ($this->site_id > 0) {
$this->path = $this->site_id . "/" . $path;
} else {
$this->path = $path;
}
$this->path = $this->upload_path . "/" . $this->path;
return $this;
}
/**
* 远程拉取图片
* @param $path
* @param string $file_name
* @return array|bool|mixed|string
*/
public function remotePull($path, $file_name = '')
{
try {
$file_path = $this->path;
// 检测目录
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0)
return $checkpath_result;
$file_name = $file_path . ($file_name ?: $this->createNewFileName());
$new_file = $file_name .'.'. $this->getFileExt($path, 'jpg');
$file = $this->curlGetFile($path);
$image = $this->getImageService($file);
$image = $this->imageWater($image);
$result = $this->imageCloud($image, $new_file);//原图云上传(文档流上传)
if ($result[ "code" ] < 0)
return $result;
return $this->success([ "pic_path" => $result[ "data" ] ]);
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
}
/**
* 数据流上传图片
* @param $file
* @return array|bool|mixed|string
*/
public function binaryImage($file)
{
$file_path = $this->path;
// 检测目录
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0)
return $checkpath_result;
$file_name = $file_path . $this->createNewFileName();
$new_file = $file_name . ".png";
$image = $this->getImageService($file);
$result = $this->imageCloud($image, $new_file);//原图云上传(文档流上传)
if ($result[ "code" ] < 0)
return $result;
return $this->success([ "pic_path" => $result[ "data" ] ]);
}
/**
* 相册图片上传
* @param $param
* @return array|bool|mixed|\multitype|string
*/
public function remotePullAndToAlbum($param)
{
/*$param = [
'thumb_type' => ['BIG', 'MID', 'SMALL'],
'remote_path' => '123.jpg',
'album_id' => $album_id,
'is_thumb' => 1,
];*/
$file_path = $this->path;
$checkpath_result = $this->checkPath($file_path);//验证写入文件的权限
if ($checkpath_result[ "code" ] < 0){
return $checkpath_result;
}
$file = $this->curlGetFile($param['remote_path']);
if (empty($file)){
return $this->error('图片获取失败');
}
$original_name = $param['remote_path'];//文件原名
$extend_name = $this->getFileExt($original_name, 'jpg');
$file_name = $file_path . $this->createNewFileName();
$this->ext = $extend_name;
$thumb_type = $param[ "thumb_type" ];//所留
$album_id = $param[ "album_id" ];
$is_thumb = $param[ 'is_thumb' ] ?? 0;
$new_file = $file_name . "." . $extend_name;
$image = $this->getImageService($file);
$width = $image->width;//图片宽
$height = $image->height;//图片高
$result = $this->imageCloud($image, $new_file);//原图云上传(文档流上传)
if ($result[ "code" ] < 0)
return $result;
if ($is_thumb == 1) {
$thumb_res = $this->thumbBatch($result[ 'data' ], $file_name, $extend_name, $thumb_type);//生成缩略图
if ($thumb_res[ "code" ] < 0)
return $result;
}
$arr = explode('/', $original_name);
$pic_name = end($arr);
$pic_name = str_replace('.'.$extend_name, '', $pic_name);
$data = array (
"pic_path" => $result[ "data" ],//图片云存储
"pic_name" => $pic_name,
"pic_spec" => $width . "*" . $height,
"update_time" => time(),
"site_id" => $this->site_id,
"album_id" => $album_id,
"is_thumb" => $is_thumb,
);
$album_model = new Album();
$res = $album_model->addAlbumPic($data);
if ($res[ 'code' ] >= 0) {
$data[ "id" ] = $res[ "data" ];
return $this->success($data, "UPLOAD_SUCCESS");
} else {
return $this->error($res);
}
}
/**
* 二维码生成 返回base64
* @param $url
* @return array
*/
public function qrcode($url)
{
$file_path = qrcode($url, "weixinpay/qrcode/" . date("Ymd") . '/', date("Ymd") . 'qrcode');
//$file图片地址
//Filetype: JPEG,PNG,GIF
$file = $file_path;
if ($fp = fopen($file, "rb", 0)) {
$gambar = fread($fp, filesize($file_path));
fclose($fp);
$base64 = "data:image/jpg/png/gif;base64," . chunk_split(base64_encode($gambar));
$this->deleteFile($file_path);
return $this->success($base64);
} else {
return $this->error();
}
}
public function deletePic($pic_path, $site_id)
{
if (strpos($pic_path, 'https://') === 0 || strpos($pic_path, 'http://') === 0) {
event("ClearAlbumPic", [ "pic_path" => $pic_path, "site_id" => $site_id ]);
} else {
if (file_exists($pic_path)) {
unlink($pic_path);
}
if (file_exists(str_replace(__ROOT__."/", "", img($pic_path, 'BIG')))) {
unlink(str_replace(__ROOT__."/", "", img($pic_path, 'BIG')));
}
if (file_exists(str_replace(__ROOT__."/", "", img($pic_path, 'MID')))) {
unlink(str_replace(__ROOT__."/", "", img($pic_path, 'MID')));
}
if (file_exists(str_replace(__ROOT__."/", "", img($pic_path, 'SMALL')))) {
unlink(str_replace(__ROOT__."/", "", img($pic_path, 'SMALL')));
}
}
}
/**
* curl请求获取文件
* @param $path
* @return bool|string
*/
public function curlGetFile($path)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $path);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
$file = curl_exec($ch);
curl_close($ch);
return $file;
}
/**
* 获取文件后缀
* @param $file_name
* @return false|mixed|string
*/
public function getFileExt($file_path, $default_ext = 'jpg')
{
$url_data = parse_url($file_path);
$path = $url_data['path'] ?? '';
$arr = explode('.', $path);
if(count($arr) > 1){
$extend_name = end($arr);
}else{
$extend_name = $default_ext;
}
return $extend_name;
}
public function checkAudio()
{
try {
$file = request()->file();
$rule_array = [];
$size_rule = '';
$ext_rule = "mp3,wav";
//可能的格式比较多,先不做校验
//$mime_rule = "audio/mpeg,audio/x-wav";
if (!empty($size_rule)) {
$rule_array[] = "fileSize:{$size_rule}";
}
if (!empty($ext_rule)) {
$rule_array[] = "fileExt:{$ext_rule}";
}
if (!empty($mime_rule)) {
$rule_array[] = "fileMime:{$mime_rule}";
}
$rule = implode("|", $rule_array);
$file_name = array_keys($file)[0];
$res = validate([ $file_name => $rule ])->check($file);
if ($res) {
return $this->success();
} else {
return $this->error();
}
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
}
/**
* 视频上传
* @param $param
* @return array
*/
public function audio($param)
{
$check_res = $this->checkAudio();
if ($check_res[ "code" ] >= 0) {
// 获取表单上传文件
$file = request()->file($param[ "name" ]);
try {
$extend_name = $file->getOriginalExtension();
$new_name = $this->createNewFileName() . "." . $extend_name;
$file_path = $this->path;
\think\facade\Filesystem::disk('public')->putFileAs($file_path, $file, $new_name);
$file_name = $file_path . $new_name;
$result = $this->fileCloud($file_name);
return $this->success([ "path" => $result[ 'data' ] ?? '' ], "UPLOAD_SUCCESS");
} catch (\think\exception\ValidateException $e) {
return $this->error('', $e->getMessage());
}
} else {
return $check_res;
}
}
/**
* 检测图片链接是否有效
* @param $url
* @return bool
*/
function isImageLinkValid($url)
{
//本地图片判断
if(strpos($url, 'http') !== 0){
return is_file($url);
}else{
/*[
"HTTP/1.1 200 OK",
"Content-Type: image/jpeg",
"Content-Length: 470503",
...
]*/
$headers = @get_headers($url);
if (is_array($headers) && strpos($headers[0], '200 OK') !== false) {
foreach($headers as $header){
if(strpos($header, 'Content-Type: image/') !== false){
return true;
}
}
}
return false;
}
}
}