Files
shop-platform/src/extend/Upload.php
2025-12-02 15:36:42 +08:00

417 lines
8.7 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 extend;
/**
* 上传控制器
* @author Administrator
*
*/
class Upload
{
/**
* @var string 错误信息
*/
public $error;
/**
* @var array 上传规则
*/
public $validate = [];
/**
* @var array 上传文件信息
*/
public $info;
/**
* @var string 当前完整文件名
*/
protected $filename;
/**
* @var array 上传文件信息
*/
public function __construct($filename = '')
{
$this->filename = $filename;
}
/**
* 设置上传信息
* @param unknown $filename
*/
public function setFilename($filename)
{
$this->file = $filename;
return $this;
}
/**
* 设置上传信息
* @param array $info
* @return \util\Upload
*/
public function setUploadInfo($info)
{
$this->info = $info;
return $this;
}
/**
* 获取上传文件的信息
* @access public
* @param string $name 信息名称
* @return array|string
*/
public function getInfo($name = '')
{
return isset($this->info[ $name ]) ? $this->info[ $name ] : $this->info;
}
/**
* 设置文件上传文件的验证规则
* @param array $rule
* @return \util\Upload
*/
public function setValidate(array $rule = [])
{
$this->validate = $rule;
return $this;
}
/**
* 验证目录是否可写
* @param unknown $path
* @return boolean
*/
public function checkPath($path)
{
if (is_dir($path) || mkdir($path, 0755, true)) {
return true;
}
$this->error = [ 'directory {:path} creation failed', [ 'path' => $path ] ];
if(!defined("initroute_tag")) exit();
return false;
}
/**
* 检测是否合法的上传文件
* @access public
* @return bool
*/
public function isValid()
{
return $this->isTest ? is_file($this->filename) : is_uploaded_file($this->filename);
}
/**
* 检测上传文件
* @access public
* @param array $rule 验证规则
* @return bool
*/
public function check($rule = [])
{
$rule = $this->validate;
/* 检查文件大小 */
if (isset($rule['size']) && !$this->checkSize($rule['size'])) {
$this->error = 'filesize not match';
return false;
}
/* 检查文件 Mime 类型 */
if (isset($rule['type']) && !$this->checkMime($rule['type'])) {
$this->error = 'mimetype to upload is not allowed';
return false;
}
/* 检查文件后缀 */
if (isset($rule['ext']) && !$this->checkExt($rule['ext'])) {
$this->error = 'extensions to upload is not allowed';
return false;
}
return true;
}
/**
* 检测上传文件大小
* @access public
* @param integer $size 最大大小
* @return bool
*/
public function checkSize($size)
{
return $this->getFileSize($this->info["tmp_name"]) <= $size;
}
/**
* 检测上传文件类型
* @access public
* @param array|string $mime 允许类型
* @return bool
*/
public function getFileSize($filename)
{
$filesize = filesize($filename);
clearstatcache();
return $filesize;
}
/**
* 获取文件类型
* @param unknown $filename
* @return unknown
*/
public function getFileType($filename)
{
// filetype($filePath);
$finfo = finfo_open(FILEINFO_MIME_TYPE); // 返回 mime 类型
$filetype = finfo_file($finfo, $filename);
finfo_close($finfo);
return $filetype;
}
/**
* 检测上传文件类型
* @access public
* @param array|string $mime 允许类型
* @return bool
*/
public function checkMime($mime)
{
$mime = is_string($mime) ? explode(',', $mime) : $mime;
return in_array(strtolower($this->getFileType($this->info["tmp_name"])), $mime);
}
/**
* 获取文件类型信息
* @access public
* @return string
*/
public function getMime()
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
return finfo_file($finfo, $this->filename);
}
/**
* 检测上传文件后缀
* @access public
* @param array|string $ext 允许后缀
* @return bool
*/
public function checkExt($ext)
{
if (is_string($ext)) {
$ext = explode(',', $ext);
}
$extension = strtolower($this->getFileExt($this->getInfo('name')));
return in_array($extension, $ext);
}
/**
* 获取文件后缀
* @param unknown $filename
* @return mixed
*/
public function getFileExt($filename)
{
return pathinfo($filename, PATHINFO_EXTENSION);
}
/**
* 移动文件
* @param unknown $path
* @param string $savename
* @param string $replace
* @return boolean|\util\Upload
*/
public function move($path, $savename, $replace = true)
{
// 文件上传失败,捕获错误代码
if (!empty($this->info['error'])) {
$this->error($this->info['error']);
return false;
}
// 验证上传
if (!$this->check()) {
return false;
}
$path = rtrim($path, "/") . "/";
// 文件保存命名规则(有外部传入)
$filename = $path . $savename;
// 检测目录
if (false === $this->checkPath(dirname($filename))) {
return false;
}
// 不覆盖同名文件
if (!$replace && is_file($filename)) {
$this->error = [ 'has the same filename: {:filename}', [ 'filename' => $filename ] ];
return false;
}
/* 移动文件 */
if (!move_uploaded_file($this->filename, $filename)) {
$this->error = 'upload write error';
return false;
}
return $filename;
}
/**
* 检测图像文件
* @access public
* @return bool
*/
public function checkImg()
{
$extension = strtolower($this->getFileExt($this->getInfo('name')));
// 如果上传的不是图片,或者是图片而且后缀确实符合图片类型则返回 true
return !in_array($extension, [ 'gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf' ]) || in_array($this->getImageType($this->filename), [ 1, 2, 3, 4, 6, 13 ]);
}
/**
* 判断图像类型
* @access protected
* @param string $image 图片名称
* @return bool|int
*/
protected function getImageType($image)
{
if (function_exists('exif_imagetype')) {
return exif_imagetype($image);
}
try {
$info = getimagesize($image);
return $info ? $info[2] : false;
} catch (\Exception $e) {
return false;
}
}
/**
* 得到图片mime信息
* @param unknown $image
* @return boolean
*/
public function getImageInfo($image)
{
try {
$info = getimagesize($image);
return $info;
} catch (\Exception $e) {
return false;
}
}
/**
*获取一个新文件名
*/
public function createNewFileName()
{
$name = date('Ymdhis', time())
. sprintf('%03d', microtime(true) * 1000)
. sprintf('%02d', mt_rand(10, 99));
return $name;
}
/**
* 这里$data为一个数组类型
* $data[0] 为图像的宽度
* $data[1] 为图像的高度
* $data[2] 为图像的格式包括jpg、gif和png等
* $data[3] 为图像的宽度和高度,内容为 width="xxx" height="yyy"
*/
private function getFileSizeData($file_name)
{
$data = getimagesize($file_name); // 图片名称
return $data;
}
/**
* 获取错误信息(支持多语言)
* @access public
* @return string
*/
public function getError()
{
return $this->error;
}
/**
* 获取文件名称
* @param unknown $file_name
*/
public function getFileName($file_name)
{
return basename($file_name, "." . $this->getFileExt($file_name));
}
/**
* 获取错误代码信息
* @access private
* @param int $errorNo 错误号
* @return $this
*/
private function error($errorNo)
{
switch ($errorNo) {
case 1:
case 2:
$this->error = 'upload File size exceeds the maximum value';
break;
case 3:
$this->error = 'only the portion of file is uploaded';
break;
case 4:
$this->error = 'no file to uploaded';
break;
case 6:
$this->error = 'upload temp dir not found';
break;
case 7:
$this->error = 'file write error';
break;
default:
$this->error = 'unknown upload error';
}
return $this;
}
/**
* @param $path
* @return bool
*/
public function checkAll($path, $savename){
// 文件上传失败,捕获错误代码
if (!empty($this->info['error'])) {
$this->error($this->info['error']);
return false;
}
// 验证上传
if (!$this->check()) {
return false;
}
$path = rtrim($path, "/") . "/";
// 文件保存命名规则(有外部传入)
$filename = $path . $savename;
// 检测目录
if (false === $this->checkPath(dirname($filename))) {
return false;
}
return true;
}
}