You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

176 lines
5.2 KiB

<?php
/*
* The MIT License
*
* Copyright 2019 Blobt.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace iron\actions;
use yii\base\Action;
use Yii;
use yii\base\Exception;
use yii\web\Response;
use yii\web\UploadedFile;
/***
* @author iron <weiriron@gmail.com>
* @created Sep 11, 2019
*/
class UploadAction extends Action
{
/**
* 常量:表单数据类型
*/
const DATA_TYPE_FORM = 1;
/**
* 常量: 二进制数据类型
*/
const DATA_TYPE_BINARY = 2;
/**
* @var integer 限制的最大尺寸
*/
public $maxSize;
/**
* @var array 允许的文件类型(扩展名)
*/
public $allowType;
/**
* @var string 文件保存路径
*/
public $path;
/**
* @var string 数据类型
*/
public $dataType;
/**
* @var bool 是否随机文件名(默认为随机,推荐为随机避免中文文件名导致的问题)
*/
public $randName = true;
/**
* @var integer 默认单次最大上传数量(1-20)
*/
public $maxCount;
public function init()
{
if ($this->maxSize === null) {
$this->maxSize = 2048;//默认最大尺寸为2M
}
if ($this->allowType === null) {
$this->allowType = ['*'];//默认允许任何图片类型
}
if ($this->maxCount === null) {
$this->maxCount = 5;//默认单次最大上传数量为5
}
if ($this->dataType === null) {
$this->dataType = self::DATA_TYPE_FORM;//默认上传数据类型为表单数据
}
}
public function run()
{
Yii::$app->response->format = Response::FORMAT_JSON;
$data = [];
d(Yii::$app->request->post());exit;
if ($this->dataType == self::DATA_TYPE_FORM) {
$files = UploadedFile::getInstancesByName('files');
} else {
//TODO 非表单类型的文件上传
$files = [];
}
try {
foreach ($files as $file) {
$this->checkType($file->extension);
$this->checkSize($file->size);
$savePath = $this->getSavePath();
$fileName = $this->getFileName($file->baseName);
$filePath = "$savePath/$fileName.{$file->extension}";
$file->saveAs($filePath);
$data[] = ["uploads/$this->path/$fileName.{$file->extension}"];
}
return ['status' => true, 'paths' => $data];
} catch (\Exception $e) {
return ['status' => false, 'info' => $e->getMessage()];
}
}
/**
* 检查文件类型是否允许上传
* @param $extension 文件扩展名
* @return bool
* @throws Exception
*/
protected function checkType($extension)
{
if (in_array('*', $this->allowType)) {
return true;
}
if (!in_array($extension, $this->allowType)) {
throw new Exception("类型【{$extension}】不被允许,请在配置项中添加该类型");
}
}
/**
* 检查文件尺寸是否超过最大允许上传尺寸
* @param $size 文件尺寸
* @throws Exception
*/
protected function checkSize($size)
{
if ($size/1024 > $this->maxSize) {
throw new Exception("文件大于允许的最大尺寸【{$this->maxSize}】,请修改配置或压缩文件");
}
}
/**
* 获取文件保存路径并创建文件夹
* @return string 文件保存的完成路径
*/
protected function getSavePath()
{
$dirs = explode('/', $this->path);
$savePath = Yii::getAlias('@app').'/web/uploads';
if (!is_dir($savePath)) {
mkdir($savePath, 755);
}
foreach ($dirs as $dir) {
$savePath .= "/{$dir}";
if (!is_dir($savePath)) {
mkdir($savePath, 755);
}
}
return $savePath;
}
/**
* 利用时间戳加随机数构建新文件名
* @param $originName 源文件名
* @return string
*/
//TODO 利用原文件名生成新文件名
protected function getFileName($originName)
{
return time() . rand(0, 9999);
}
}