building-sign/app/controller/manager/Upload.php

230 lines
9.3 KiB
PHP
Raw Permalink Normal View History

2023-01-09 08:41:41 +00:00
<?php
namespace app\controller\manager;
use app\exception\RepositoryException;
use app\service\Image;
use app\model\{System, File};
use app\validate\Upload as VUpload;
use think\facade\{Filesystem, Config, Lang};
use think\Image as TImage;
use app\controller\BaseController;
class Upload extends BaseController
{
protected $noNeedLogin = ['video', 'file', 'image', 'wangImage'];
private $isCompress = true;
private $validate;
private $uploadPath;
private $videoUploadPath;
private $uploadPathIsWritable = 0;
private $videoUploadPathIsWritable = 0;
private $DIRECTORY_SEPARATOR = "/";
public function initialize()
{
$system = System::getSystem();
if (!empty($system)) {
$this->isCompress = $system['compress'] ?? true;
}
$this->validate = new VUpload();
$this->uploadPath = Config::get('filesystem.disks.local.url');
$this->videoUploadPath = Config::get('filesystem.disks.video.url');
if (!is_writable(app()->getRootPath().'public'.$this->uploadPath)) {
mkdir(app()->getRootPath().'public'.$this->uploadPath, 0777, true);
}
$this->uploadPathIsWritable = 1;
if (!is_writable(app()->getRootPath().'public'.$this->videoUploadPath)) {
mkdir(app()->getRootPath().'public'.$this->videoUploadPath, 0777,true);
}
$this->videoUploadPathIsWritable = 1;
$this->DIRECTORY_SEPARATOR = DIRECTORY_SEPARATOR == "\\" ? "/" : DIRECTORY_SEPARATOR;
ini_set('max_execution_time', '0');
ini_set("memory_limit", '-1');
set_time_limit(0);
}
//视频上传
public function video()
{
$video = request()->file('video_video');
try {
if ($this->validate->checkVideo($video)) {
if (!$this->videoUploadPathIsWritable) {
throw new \Exception('上传文件夹需要写入权限');
}
$md5 = $video->md5();//文件md5
$path = request()->param('path/s', '');//指定路径 基于public下 若为空则默认
$hasPath = !empty($path);
// 去除以/storage/开头的部分 如/storage/20210808/test => 20210808/test
$path = ltrim(trim($path, $this->DIRECTORY_SEPARATOR), \app\model\Attachment::ROOT_NAME.$this->DIRECTORY_SEPARATOR);
$datePath = $hasPath ? $path : 'videos'.$this->DIRECTORY_SEPARATOR.date('Ym');//自定义目录
$src = Filesystem::putFile($datePath, $video, 'uniqid');
$src = $this->uploadPath.'/'.$src;
$return['src'] = $src;
File::add($video, $src, $md5, 'video'); //加入上传文件表
return $this->json(0, 'ok', $return);
} else {
$errorMsg = Lang::get($this->validate->getError());
return $this->json(1, $errorMsg);
}
} catch (RepositoryException $e) {
return $this->json(1, $e->getMessage());
}
}
//文件上传(通用)
public function file()
{
$file = request()->file('file_file');
$md5 = $file->md5();//文件md5
$fileName = $file->getOriginalName();//原始文件名
// if ($fileItem = File::where('md5', $md5)->find()) {
// $return['src'] = $fileItem['src'];
// $return['name'] = $fileName;
// $fileItem['updated_at'] = date('Y-m-d H:i:s');
// return $this->json(200, '该文件已存在 路径为:'.$fileItem['path'], $return);
// }
if ($this->validate->checkFile($file)) {
try {
if (!$this->uploadPathIsWritable) {
throw new \Exception('上传文件夹需要写入权限');
}
$src = Filesystem::putFile('files'.$this->DIRECTORY_SEPARATOR.date('Ym'), $file, 'uniqid');
$src = $this->uploadPath.$this->DIRECTORY_SEPARATOR.$src;
$return['src'] = $src;
$return['name'] = $fileName;
File::add($file, $src, $md5, 'file'); //加入上传文件表
} catch (\Exception $e) {
return $this->json(1, $e->getMessage());
}
return $this->json(0, 'ok', $return);
} else {
$errorMsg = Lang::get($this->validate->getError());
return $this->json(1, $errorMsg);
}
}
//图片上传(通用)
public function image()
{
// 字段名 image-image避免冲突 layui组件自动生成的隐藏file input框中name容易重名冲突
$image = request()->file('image_image');
try {
$res = $this->uploadImage($image);
return $this->json(0, '上传成功', $res);
} catch (RepositoryException $e) {
return $this->json(1, $e->getMessage());
}
}
public function uploadImage($image)
{
// 字段名 image-image避免冲突 layui组件自动生成的隐藏file input框中name容易重名冲突
$md5 = $image->md5();//文件md5
$path = request()->param('path/s', '');//指定路径 基于public下 若为空则默认
$hasPath = !empty($path);
if ($this->validate->checkImage($image)) {
// if ($fileItem = File::where('md5', $md5)->find()) {
// $return['src'] = $fileItem['src'];
// $fileItem['updated_at'] = date('Y-m-d H:i:s');
//
// return $this->json(200, '该文件已存在 路径为:'.$fileItem['path'], $return);
// }
try {
if (!$this->uploadPathIsWritable) {
throw new \Exception('上传文件夹需要写入权限');
}
// 去除以/storage/开头的部分 如/storage/20210808/test => 20210808/test
if (strpos(trim($path, $this->DIRECTORY_SEPARATOR), \app\model\Attachment::ROOT_NAME.$this->DIRECTORY_SEPARATOR) === 0) {
$path = substr(trim($path, $this->DIRECTORY_SEPARATOR), strlen(\app\model\Attachment::ROOT_NAME.$this->DIRECTORY_SEPARATOR));
}
$datePath = $hasPath ? $path : 'images'.$this->DIRECTORY_SEPARATOR.date('Ym');//自定义目录
$datePath = ($datePath == $this->DIRECTORY_SEPARATOR."storage") ? $this->DIRECTORY_SEPARATOR : $datePath;
$src = Filesystem::putFile($datePath, $image, 'uniqid');
$src = $this->uploadPath . $this->DIRECTORY_SEPARATOR . $src;
$suffix = strtolower($image->getOriginalExtension());
if ($suffix == 'gif') {
$return['thumb_src'] = $src; //TODO获取GIF缩略图
} else {
$return['thumb_src'] = Image::getThumb($src, 100, 100, TImage::THUMB_SCALING); //上传返回缩略图宽度为100
}
$return['src'] = $src;
if ($this->isCompress) {
Image::resize($src);
}
File::add($image, $src, $md5); //加入上传文件表
} catch (\Exception $e) {
throw new RepositoryException($e->getMessage());
}
return $return;
} else {
$errorMsg = Lang::get($this->validate->getError());
throw new RepositoryException($errorMsg);
}
}
//富文本编辑器上传图片
public function tinyImage()
{
$image = request()->file('file');
if (!$image) {
// 字段名不对
header("HTTP/1.1 404 config field error");
exit;
}
if (!$this->uploadPathIsWritable) {
header("HTTP/1.1 403 Insufficient folder permissions");
exit;
} else {
$md5 = $image->md5();//文件md5
// if ($fileItem = File::where('md5', $md5)->find()) {
// $fileItem['updated_at'] = date('Y-m-d H:i:s');
//
// $fileItem->save();
// $res['location'] = $fileItem['src'];
// return json($res);
// }
if (!in_array(strtolower($image->getMime()), ['image/png','image/jpeg','image/jpg','image/gif'])) {
header("HTTP/1.1 400 MIME TYPE ERROR");
exit;
}
checkPathExistWithMake(public_path().$this->uploadPath.'/images/'.date('Ym'));
// tinymce富文本对图片进行操作后xuan上传的是blob文件。
// 针对blob文件未读取到后缀名 自动生成后缀 默认用mimetype后缀 如image/jpeg =》jpeg
$newFileName = $image->hashName('uniqid');
if (isset(explode('.',$newFileName)[1]) && empty(explode('.',$newFileName)[1])) {
$ext = explode('/', $image->getOriginalMime());
$newFileName .= $ext[1];
}
$src = Filesystem::putFileAs('images/'.date('Ym'), $image, $newFileName);
$src = $this->uploadPath.$this->DIRECTORY_SEPARATOR.$src;
if ($this->isCompress) {
// 剪切
//Image::resize($src);
}
File::add($image, $src, $md5); //加入上传文件表
$res['location'] = $src;
return json($res);
}
}
}