群控系统服务端开发模式-应用开发-文件上传功能开发

一、文件上传路由

在根目录下route文件夹中app.php文件中,添加文件上传功能路由,代码如下:

复制代码
Route::post('upload/file','common.Upload/file');// 上传文件接口

二、功能代码开发

在根目录下app文件夹下common文件夹中创建上传控制器并命名为Upload,代码如下:

复制代码
<?php
/**
 * 上传
 * User: 龙哥·三年风水
 * Date: 2024/11/4
 * Time: 10:14
 */
namespace app\controller\common;
use app\controller\Base;
use app\model\param\Upload as ParamUpload;
use Error\BaseError;
use think\exception\ValidateException;
use Upload\UploadFactory;

class Upload extends Base
{
    //上传文件
    public function file(){
        $file = $this->request->file();
        $type = $this->request->param('type');
        try{
            $files = $file['file'];
            //查出上传设置
            $uploadparam = ParamUpload::dataFind(['id' => 1],'upload_type,checked_images,checked_videos,checked_filedocs,upload_number');
            //当下验证后缀
            $fileExt = [];
            //指定类型
            switch ($type){
                case 'image':
                    $fileExt = $uploadparam['checked_images'];
                    break;
                case 'video':
                    $fileExt = $uploadparam['checked_videos'];
                    break;
                case 'filedoc':
                    $fileExt = $uploadparam['checked_filedocs'];
                    break;
                default:
                    throw new ValidateException('不支持的通道');
                    break;
            }
            //验证
            validate(['file'=>'fileSize:'.($uploadparam['upload_number'] * 1024 * 1024).'|fileExt:'.$fileExt])->check($file);
            //获取文件后缀名
            $fileExtName = $files->getOriginalExtension();
            //新的文件名
            $fileName = str_replace('.'.$fileExtName,'',$files->getOriginalName());
            //截取文件后缀名
            $format = '.'.$fileExtName;//截取文件后缀名如 (.jpg)
            //原文件
            $primaryFileName = $fileName.$format;
            //加密后的文件
            $encryptionFileName = sha1(date('YmdHis', time()) . uniqid()) . $format;
            //要上传的路径
            $object = date('Y-m-d').'/'.$encryptionFileName;
            //临时文件地址
            $filePath = $files->getRealPath();
            //计算文件大小
            $fileSize = sprintf("%01.2f", $files->getSize()/(1024*1024));
            //调用工厂
            $uploadFactory = new UploadFactory();
            //选择通道
            $uploadHandle = $uploadFactory->getUploadHandle();
            $res = $uploadHandle->uploadFile($object,$uploadparam['upload_type'] == 1 ? $files : $filePath);
            $data['url'] = $res;
            $data['primary_fileName'] = $primaryFileName;
            $data['encryption_fileName'] = $encryptionFileName;
            $data['fileName_size'] = $fileSize;
            $data['fileName_type'] = $fileExtName;
            return succ('上传成功',$data);
        }catch (ValidateException $e){
            throw new BaseError($e->getMessage(),50000,200);
        }
    }
}

三、测试

通过测试,发现一个错误,在上传文件工厂控制类里面。第一个就是参数错误,第二个是调用上传通道错误。《群控系统服务端开发模式-应用开发-上传工厂开发》中代码已修改。

相关推荐
ACP广源盛1392462567340 分钟前
IX7008 PCIe 交换芯片@ACP#RTX Spark 经济型 8 口扩展芯片(对比 ASM1806)
大数据·人工智能·分布式·嵌入式硬件·gpt·spark·电脑
ch3nyuyu1 小时前
socket套接字
开发语言·php
ACP广源盛139246256731 小时前
IX6012 PCIe 交换芯片@ACP#RTX Spark 入门级 12 口存储外设扩展方案(对比 ASM1812)
大数据·人工智能·分布式·嵌入式硬件·gpt·spark·电脑
leagsoft_10032 小时前
零信任选型五刀法——零信任怎么选?五个问题,五条红线
开发语言·php
分布式存储与RustFS3 小时前
对标MinIO!RustFS新一代AI分布式对象存储开源能力前瞻
人工智能·分布式·开源·分布式对象存储·rustfs·minio平替·s3 table
yyuuuzz3 小时前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache
juesdo4 小时前
青岑CTF web入门 EZCMD系列
web安全·网络安全·php
RisunJan4 小时前
Linux命令-php(PHP语言的命令行接口)
linux·php
cxr8284 小时前
蜂群智能系统中“非必要不添加“原则的有效性再审视:基于分布式决策与通信复杂度的理论推导
人工智能·分布式·智能体
bIo7lyA8v4 小时前
算法工程中的可扩展性与分布式实现方案的技术8
分布式