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

1197 lines
42 KiB
PHP
Executable File
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
/**
* 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;
}
}
}