building-sign/app/controller/Upload.php

158 lines
4.8 KiB
PHP
Raw Normal View History

2023-01-09 08:41:41 +00:00
<?php
namespace app\controller;
use app\model\File;
use app\validate\Upload as VUpload;
use think\facade\Config;
use think\facade\Filesystem;
use think\facade\Lang;
use think\response\Json;
/**
* 文件上传
*
* Class Upload
* @package app\controller\api\file
*/
class Upload extends Base
{
protected $noNeedLogin = [];
// 图片上传是否进行压缩[max-width:1920px]
private bool $isCompress = false;
private $validate = null;
// 文件上传对外默认保存目录(相对路径)
private string $uploadPath = '';
private $videoUploadPath;
// 文件上传对外默认保存目录是否有写权限
private bool $uploadPathIsWritable = false;
private $videoUploadPathIsWritable = 0;
protected bool $saveToOos = false;
public function initialize()
{
parent::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;
}
/**
* 通用文件上传
* @return Json
*/
public function file()
{
$file = request()->file('file');
if (empty($file)) {
return $this->json(4001, '请上传的文件');
}
if ($this->validate->checkFile($file)) {
try {
if (!$this->uploadPathIsWritable) {
throw new \Exception('上传文件夹需要写入权限');
}
$src = Filesystem::putFile('files/'.date('Ym'), $file, 'uniqid');
$src = $this->uploadPath.'/'.$src;
$return['src'] = $src;
$return['name'] = $file->getOriginalName();
//加入上传文件表
File::add($file, $src, $file->md5());
} catch (\Exception $e) {
return $this->json(4003, $e->getMessage());
}
return $this->json(0, 'success', $return);
} else {
$errorMsg = Lang::get($this->validate->getError());
return $this->json(4002, $errorMsg);
}
}
/**
* 通用图片上传
* @return Json
*/
public function image()
{
$image = request()->file('image');
if (empty($image)) {
return $this->json(4001, '请上传图片文件');
}
if (!in_array($image->getMime(), ['image/png', 'image/jpeg', 'image/bmp'])) {
return $this->json(4001, '请上传png|jpeg|jpg|bmp格式图片');
}
if ($image->getSize() > 1.5 * 1024 * 1024) {
return $this->json(4001, '图片超出尺寸要求');
}
try {
if (!$this->uploadPathIsWritable) {
throw new \Exception('上传文件夹需要写入权限');
}
$src = Filesystem::putFile('images/'.date('Ym'), $image, 'uniqid');
$src = $this->uploadPath.'/'.$src;
$return['src'] = $src;
} catch (\Exception $e) {
return $this->json(4003, $e->getMessage());
}
return $this->json(0, 'success', $return);
}
/**
* 通用视频上传
* @return Json
*/
public function video()
{
try {
$file = request()->file('video');
$md5 = $file->md5();//文件md5
if ($this->validate->checkVideo($file)) {
if (!$this->videoUploadPathIsWritable) {
throw new \Exception('上传文件夹需要写入权限');
}
$src = Filesystem::putFile('videos/'.date('Ym'), $file, 'uniqid');
$src = $this->uploadPath.'/'.$src;
$return['src'] = $src;
$return['full_src'] = resourceJoin($src);
//加入上传文件表
File::add($file, $src, $md5, 'video');
return $this->json(0, 'success', $return);
} else {
$errorMsg = Lang::get($this->validate->getError());
return $this->json(4002, $errorMsg);
}
} catch (\Exception $e) {
return $this->json(4000, $e->getMessage());
}
}
}