简易代码
//按名称获取实例
$file = yii\web\UploadedFile::getInstanceByName($name);
if (empty($file)) {
return ['code' => 1, 'msg' => '上传失败,没有文件!'];
}
//是否有错误
if ($file->getHasError()) {
return ['code' => 1, 'msg' => '文件异常!'];
}
$savePath = '保存地址'
if ($file->saveAs($savePath)) {
return ['code' => 0, 'msg' => '保存成功!'];
}
return ['code' => 1, 'msg' => '文件保存异常!'];
封装代码
ps:需根据自身业务需求考虑调整代码
思路:获取文件->验证文件->组织保存路径->保存文件->返回文件路径
/**
* 文件上传
* @param string $name 表单文件名
* @param $isEncode bool 是否编码
* @param int[] $sizeConfig 不同文件类型对应允许的大小
* @return array
*/
function file_upload($name = 'file', $sizeConfig = ['xlsx' => 10, 'png' => 1], $$ = false)
{
try {
//按名称获取实例
$file = yii\web\UploadedFile::getInstanceByName($name);
if (empty($file)) {
return ['code' => 1, 'msg' => '上传失败,没有文件!'];
}
//是否有错误
if ($file->getHasError()) {
return ['code' => 1, 'msg' => '文件异常!'];
}
//1M
$default = 1048576;
//匹配文件后缀
$extension = $file->getExtension();
if (!in_array($extension, array_keys($sizeConfig))) {
return ['code' => 1, 'msg' => '暂不支持上传' . $extension . '文件'];
}
if ($file->size > $sizeConfig[$extension] * $default) {
return ['code' => 1, 'msg' => '上传文件过大!'];
}
$basePath = dirname(\Yii::getAlias("@staticUploadPath"));
//根据服务创建目录
$serverName = '/' . str_replace('.', '', $_SERVER['SERVER_NAME']) . '/';
if (!is_dir($basePath . $serverName)) {
mkdir($basePath . $serverName);
}
//根据类型创建目录
$extensionPath = "$extension/";
if (!is_dir($basePath . $serverName . $extensionPath)) {
mkdir($basePath . $serverName . $extensionPath);
}
//根据日期创建目录
$datePath = date('Ymd') . '/';
if (!is_dir($basePath . $serverName . $extensionPath . $datePath)) {
mkdir($basePath . $serverName . $extensionPath . $datePath);
}
//文件名
$fileName = date('His') . md5(uniqid()) . '.' . $extension;
//路径
$savePath = $basePath . $serverName . $extensionPath . $datePath . $fileName;
if ($file->saveAs($savePath)) {
if (!file_exists($savePath)) {
return ['code' => 1, 'msg' => '文件保存失败!'];
}
$path = $serverName . $extensionPath . $datePath . $fileName;
return ['code' => 0, 'msg' => '上传成功!', 'data' => [
'fileName' => $fileName,
'path' => $isEncode ? base64_encode($path) : $path,
'webPath' => $isEncode ? base64_encode(\Yii::getAlias('@staticUrl') . '/uploads' . $path) : \Yii::getAlias('@staticUrl') . '/uploads' . $path,
'extension' => $extension,
'size' => $file->size . 'Byte'
]];
}
return ['code' => 1, 'msg' => '文件保存异常!'];
} catch (\Exception $e) {
dd($e->getMessage())
return ['code' => 1, 'msg' => '调用失败'];
}
}
2.1参数说明
$name = 'file'
表示需要前端将图片资源以file这个名称提交给后端
$sizeConfig = ['xlsx' => 10, 'png' => 1]
表示允许文件后缀为'.xlsx'、'.png'文件上传,其中xlsx文件大小不能超过10M,png文件不能超过1M
$isEncode = false
表示返回的路径是否需要加密
前端代码 (基于LayUi框架)
<div class="layui-input-block">
<button type="button" class="layui-btn" id="LAY_Upload"><i class="layui-icon"></i>上传文件</button>
</div>
upload.render({
url: '接口地址'
, elem: '#LAY_Upload'
, accept: 'file'//指定允许上传时校验的文件类型,可选值有:images(图片)、file(所有文件)、video(视频)、audio(音频)
, done: function (res) {
console.log(res)
}
})