全栈小学生 1d87b08b07 up
2025-01-03 17:59:22 +08:00

254 lines
8.9 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 core\upload;
use core\exception\UploadFileException;
use Exception;
use Grafika\Color;
use Grafika\Grafika;
use Grafika\Position;
/**
* 文件管理驱动类
*/
class Local extends BaseUpload
{
//位置
private $position = array(
'top-left' => 'top-left',
'top-center' => 'top-center',
'top-right' => 'top-right',
'center-left' => 'center-left',
'center' => 'center',
'center-right' => 'center-right',
'bottom-left' => 'bottom-left',
'bottom-center' => 'bottom-center',
'bottom-right' => 'bottom-right',
);
protected function initialize(array $config = [])
{
parent::initialize($config);
}
public function upload(string $dir)
{
$this->validate();
mkdirs_or_notexist($dir, 0777);
$this->file->move($dir, $this->file_name);
//错误一般是已经被抛出了
return true;
}
/**
* 远程获取图片
* @param string $url
* @param string|null $key
* @return true
*/
public function fetch(string $url, ?string $key)
{
try {
mkdirs_or_notexist(dirname($key), 0777);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
// $content = @file_get_contents($url);//file_get_contents下载网络图片慢更换为curl下载
if (!empty($content)) {
file_put_contents($key, $content);
$image_info = getimagesize($key);
$image_type = $image_info[2];
// if($image_type == IMAGETYPE_JPEG){
// // 保存图片为PNG格式
// $image = imagecreatefromjpeg($key);
// }else if($image_type == IMAGETYPE_PNG){
// // 保存图片为PNG格式
// $image = imagecreatefrompng($key);
// }
if($image_type == IMAGETYPE_WEBP){
// 保存图片为PNG格式
$image = imagecreatefromwebp($key);
}
// 创建图片资源
// 检查图片是否创建成功
if (!empty($image)){
// 图片类型常量定义IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF
if ($image_type == IMAGETYPE_WEBP) {
$temp_arr = explode('.', $key);
$ext = end($temp_arr);
if($ext == 'jpg' || $ext == 'jpeg'){
// 保存图片为PNG格式
imagejpeg($image, $key);
}else if($ext = 'png'){
// 保存图片为PNG格式
imagepng($image, $key);
}
}
// 释放内存
imagedestroy($image);
}
} else {
throw new UploadFileException(203006);
}
return true;
} catch ( Exception $e ) {
throw new UploadFileException($e->getMessage());
}
}
/**
* base64转图片
* @param string $content
* @param string|null $key
* @return true
*/
public function base64(string $content, ?string $key = null)
{
mkdirs_or_notexist(dirname($key));
file_put_contents(url_to_path($key), base64_decode($content));
return true;
}
/**
* 删除本地附件
* @param string $file_name
* @return bool
*/
public function delete(string $file_name)
{
$file_path = url_to_path($file_name);
if (file_exists($file_path)) {
$result = unlink($file_path);
// throw new UploadFileException(100013);
}else{
$result = true;
}
//顺便删除相关的缩略图
$dirname = dirname($file_name);
$file_list = [];
search_dir($dirname, $file_list);
if(!empty($file_list)){
$file_arr = explode('/', $file_name);
$only_file_name = end($file_arr);
foreach($file_list as $v){
if(str_contains($v, $only_file_name) && file_exists($v)){
unlink($v);
}
}
}
return $result;
}
/**
* 缩略图
* @param $file_path
* @param $thumb_type
* @return array
* @throws Exception
*/
public function thumb($file_path, $thumb_type)
{
//todo 判断缩略图是否存在
$thumb_config = config('upload.thumb.thumb_type');
// ……
//获取文件原名 获取
$file_arr = explode('/', $file_path);
$file_name = end($file_arr);
$thumb_list = [];
//获取文件后缀
foreach ($thumb_config as $k => $v) {
if ($thumb_type == 'all' || $thumb_type == $k || (is_array($thumb_type) && in_array($k, $thumb_type))) {
$new_width = $v['width'];
$new_height = $v['height'];
$new_thumb_path = str_replace($file_name, $new_width . 'x' . $new_height . '_' . $file_name, $file_path);
if (!file_exists($new_thumb_path)) {
$editor = Grafika::createEditor();
$editor->open($image, $file_path);
$editor->resizeFit($image, $new_width, $new_height);
//新缩略图文件名称
$editor->save($image, $new_thumb_path, null, null, false, 0777);
}
$thumb_list[$k] = $new_thumb_path;
}
}
return $thumb_list;
}
/**
* 图片水印
* @param $file_path
* @return mixed
* @throws Exception
*/
public function water($file_path)
{
$water_config = [];
if (!empty($water_config)) {
$status = $water_config['status'];//是否启用
if ($status) {
$editor = Grafika::createEditor();
$editor->open($image, $file_path);
if ($water_config['type'] == 'image') {
$water_image = $water_config['image'];
if (!empty($water_image)) {
//判断水印图片是否是本地图片
if (check_file_is_remote($water_image)) {
$file_arr = explode('.', $water_image);
$ext_name = end($file_arr);
$name = $this->createFileName($water_image, $ext_name);
$watermark_image = 'upload/water/' . $name;
$this->fetch($water_image, $watermark_image);
}
if (file_exists($water_image)) {
}
$editor->open($image1, $water_config['image']);
$editor->blend($image, $image1, 'normal', $water_config['opacity'], $this->position[$water_config['position']], $water_config['offset_x'], $water_config['offset_y']);
}
} else {
if ($water_config['text']) {
$position = $this->position[$water_config['position']];
$offset_x = $water_config['offset_x'];//水平偏移值
$offset_y = $water_config['offset_y'];//垂直偏移值
$width = $image->getWidth();
$height = $image->getHeight();
//获取文字信息
$info = imagettfbbox($water_config['size'], $water_config['angle'], $water_config['font'], $water_config['text']);
$minx = min($info[0], $info[2], $info[4], $info[6]);
$maxx = max($info[0], $info[2], $info[4], $info[6]);
$miny = min($info[1], $info[3], $info[5], $info[7]);
$maxy = max($info[1], $info[3], $info[5], $info[7]);
/* 计算文字初始坐标和尺寸 */
$x = $minx;
$y = abs($miny);
$w = $maxx - $minx;
$h = $maxy - $miny;
//转化坐标
$position = new Position($position, $offset_x, $offset_y);
// Position is for $image2. $image1 is canvas.
list($offset_x, $offset_y) = $position->getXY($width, $height, $w, $h);
$editor->text($image, $water_config['text'], $water_config['size'], $offset_x, $offset_y, new Color($water_config['color']), $water_config['font'], $water_config['angle']);
}
$editor->save($image, $file_path);
}
}
return $file_path;
}
}
}