Yii2文件上传 Api (不使用官方表单提交)

ps:yii官方文件上传介绍

  1. 简易代码

            //按名称获取实例
            $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' => '文件保存异常!'];
  1. 封装代码

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

表示返回的路径是否需要加密

  1. 前端代码 (基于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)
            }
        })

layui文件上传文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值