238 lines
5.2 KiB
PHP
238 lines
5.2 KiB
PHP
![]() |
<?php
|
||
|
|
||
|
namespace Modules\Common\Support\Upload\Uses;
|
||
|
|
||
|
use Catch\Exceptions\FailedException;
|
||
|
use Illuminate\Http\UploadedFile;
|
||
|
use Illuminate\Support\Str;
|
||
|
|
||
|
abstract class Upload
|
||
|
{
|
||
|
/**
|
||
|
* uploadFile object
|
||
|
*
|
||
|
* @var mixed
|
||
|
*/
|
||
|
protected mixed $file;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected array $params;
|
||
|
|
||
|
public abstract function upload();
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @return mixed|true
|
||
|
*/
|
||
|
protected function dealBeforeUpload(): mixed
|
||
|
{
|
||
|
$this->checkExt();
|
||
|
|
||
|
$this->checkSize();
|
||
|
|
||
|
// 如果是上传图片资源的的话保存
|
||
|
// 如果是由其他方式上传的图片路径就直接返回
|
||
|
if (!$this->file instanceof UploadedFile) {
|
||
|
return $this->file;
|
||
|
}
|
||
|
|
||
|
// if ($this instanceof OssUploadService) {
|
||
|
// return $this->file->getPathname();
|
||
|
// }
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getUploadPath(): array
|
||
|
{
|
||
|
$method = $this->getUploadMethod();
|
||
|
|
||
|
return $this->info($this->{$method}());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 生成文件名称
|
||
|
*
|
||
|
* @time 2019年07月26日
|
||
|
* @param string $ext
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function generateImageName(string $ext): string
|
||
|
{
|
||
|
$filename = $this->params['filename'] ?? '';
|
||
|
|
||
|
$randomString = date('Y') . Str::random(10) . time();
|
||
|
|
||
|
if ($filename) {
|
||
|
$randomString = $filename . '_' . $randomString;
|
||
|
}
|
||
|
|
||
|
return $randomString . '.' . $ext;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* upload method
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function getUploadMethod(): string
|
||
|
{
|
||
|
$class = get_called_class();
|
||
|
|
||
|
$class = explode('\\', $class);
|
||
|
|
||
|
$className = array_pop($class);
|
||
|
|
||
|
$method = lcfirst($className);
|
||
|
|
||
|
if (!method_exists($this, $method)) {
|
||
|
throw new FailedException(sprintf('Method %s in Class %s Not Found~', $method, $className));
|
||
|
}
|
||
|
|
||
|
return $method;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get uploaded file info
|
||
|
*
|
||
|
* @param $path
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function info($path): array
|
||
|
{
|
||
|
return [
|
||
|
'path' => $path,
|
||
|
'ext' => $this->getUploadedFileExt(),
|
||
|
'type' => $this->getUploadedFileMimeType(),
|
||
|
'size' => $this->getUploadedFileSize(),
|
||
|
'originalName' => $this->getOriginName(),
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* check extension
|
||
|
*/
|
||
|
protected function checkExt(): void
|
||
|
{
|
||
|
$extensions = config(sprintf('upload.%s.ext', $this->getUploadedFileMimeType()));
|
||
|
|
||
|
$fileExt = $this->getUploadedFileExt();
|
||
|
|
||
|
if (!in_array($fileExt, $extensions)) {
|
||
|
throw new FailedException(sprintf('不支持该上传文件类型(%s)类型', $fileExt));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* check file size
|
||
|
*/
|
||
|
protected function checkSize(): void
|
||
|
{
|
||
|
$size = 10 * 1024 * 1024;
|
||
|
|
||
|
if ($this->getUploadedFileSize() > $size) {
|
||
|
throw new FailedException('超过文件最大支持的大小');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get uploaded file mime type
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function getUploadedFileMimeType(): string
|
||
|
{
|
||
|
if ($this->file instanceof UploadedFile) {
|
||
|
|
||
|
$imageMimeType = [
|
||
|
'image/gif', 'image/jpeg', 'image/png', 'application/x-shockwave-flash',
|
||
|
'image/psd', 'image/bmp', 'image/tiff', 'image/jp2',
|
||
|
'application/x-shockwave-flash', 'image/iff', 'image/vnd.wap.wbmp', 'image/xbm',
|
||
|
'image/vnd.microsoft.icon', 'image/x-icon', 'image/*', 'image/jpg',
|
||
|
];
|
||
|
|
||
|
return in_array($this->file->getClientMimeType(), $imageMimeType) ? 'image' : 'file';
|
||
|
}
|
||
|
|
||
|
return in_array($this->getUploadedFileExt(), config('upload.image.ext')) ? 'image' : 'file';
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* get uploaded file extension
|
||
|
*
|
||
|
* @return array|string
|
||
|
*/
|
||
|
protected function getUploadedFileExt(): array|string
|
||
|
{
|
||
|
if ($this->file instanceof UploadedFile) {
|
||
|
return strtolower($this->file->getClientOriginalExtension());
|
||
|
}
|
||
|
|
||
|
// 直传文件
|
||
|
return pathinfo($this->file, PATHINFO_EXTENSION);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get uploaded file size
|
||
|
*
|
||
|
* @return false|int
|
||
|
*/
|
||
|
protected function getUploadedFileSize(): bool|int
|
||
|
{
|
||
|
if ($this->file instanceof UploadedFile) {
|
||
|
return $this->file->getSize();
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get origin name
|
||
|
*
|
||
|
* @return string|null
|
||
|
*/
|
||
|
public function getOriginName(): ?string
|
||
|
{
|
||
|
// 上传图片获取
|
||
|
if ($this->file instanceof UploadedFile) {
|
||
|
return $this->file->getClientOriginalName();
|
||
|
}
|
||
|
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 参数设置
|
||
|
*
|
||
|
* @time 2019年07月25日
|
||
|
* @param $name
|
||
|
* @param $value
|
||
|
*/
|
||
|
public function __set($name, $value)
|
||
|
{
|
||
|
$this->{$name} = $value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* set uploaded file
|
||
|
*
|
||
|
* @param mixed $file
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function setUploadedFile(mixed $file): static
|
||
|
{
|
||
|
$this->file = $file;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
}
|