Skip to content

文件上传

文件上传配置

app\config\superadminnx.php中的file_system,目前只支持配置上传到本地或上传到阿里云oss

所有上传都使用app\utils\File类,如:

查看代码
php
<?php
namespace app\admin\controller;

use support\Request;
use support\Response;
use app\utils\File as FileUtils; 

/**
 * 文件
 *
 * @author zy <741599086@qq.com>
 * @link https://www.superadminx.com/
 * */
class File
{
    //此控制器是否需要登录
    protected $onLogin = true;
    //不需要登录的方法
    protected $noNeedLogin = ['download'];

    /**
     * 上传文件
     * @method post
     * @param Request $request 
     * @return Response
     */
    public function upload(Request $request) : Response
    {
        $result = FileUtils::upload(); 
        
        if (is_array($result) && $result) {
            return result($result, 1, '上传成功', false);
        } else {
            return result([], -1, '没有文件被上传', false);
        }
    }
}

配置是上传到阿里云oss,如何上传到本地

此时直接调用 File类的uploadPublic 方法,此方法只会上传到本地,如整个项目文件是配置上传到阿里云的,当导入数据上传的excel就应该上传到本地,同时上传到tmp_file文件夹

查看代码
php
<?php
namespace app\admin\controller;

use support\Request;
use support\Response;
use app\utils\File as FileUtils; 

/**
 * 文件
 *
 * @author zy <741599086@qq.com>
 * @link https://www.superadminx.com/
 * */
class File
{
    /**
     * 上传文件
     * @method post
     * @param Request $request 
     * @return Response
     */
    public function upload(Request $request) : Response
    {
        $result = FileUtils::uploadPublic('/tmp_file'); 
        
        if (is_array($result) && $result) {
            return result($result, 1, '上传成功', false);
        } else {
            return result([], -1, '没有文件被上传', false);
        }
    }
}

临时上传或生成的临时文件

项目中有一个目录 app/public/tmp_file ,此目录是专门用来访临时文件的,每天凌晨会自动删除里面超过24小时的文件,如导出数据生成的表格就应该生成到此目录,导入数据上传的表格也上传到此目录

删除没使用的文件

所有的文件上传都会存到file表中并记录使用次数,当使用次数是0的时候则定时任务每天凌晨会删除此文件

所以模型定义中我新增了一个$file属性,代表表中哪些字段中有包含附件(上传的文件),因为继承了BaseModel模型的,从而BaseModel模型在新增数据、修改数据、删除数据的时候会从数据中提炼出所有的附件地址存到file表中,并且更新此附件的使用次数,定时任务(每天凌晨)会自动删除使用次数是0的附件文件。

php
//包含附件的字段,key是字段名称,value值是如何取值里面的图片的路劲,''代表值就是附件地址,'array'代表值是数组而数组里面的值包含了附件地址的,'editor'代表值是富文本
public $file = [
    'img' => '', //如商品的主图就是直接等于附件地址
    'imgs' => 'array', //如商品的轮播图就是数组转成json存的,那么数组里面就有附件地址
    'content' => 'editor', //如商品的详情是富文本,则里面可能有附件
];

不想删除没使用的文件

如果不想使用此功能,直接注释掉清除file的定时任务app\config\process.php

查看代码
php
<?php
/**
 * This file is part of webman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author    walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link      http://www.workerman.net/
 * @license   http://www.opensource.org/licenses/mit-license.php MIT License
 */

use support\Log;
use support\Request;
use app\process\Http;

global $argv;

return [
    'webman' => [
        'handler' => Http::class,
        'listen' => 'http://0.0.0.0:8888',
        'count' => cpu_count() * 4,
        'user' => '',
        'group' => '',
        'reusePort' => false,
        'eventLoop' => '',
        'context' => [],
        'constructor' => [
            'requestClass' => Request::class,
            'logger' => Log::channel('default'),
            'appPath' => app_path(),
            'publicPath' => public_path()
        ]
    ],
    // File update detection and automatic reload
    'monitor' => [
        'handler' => app\process\Monitor::class,
        'reloadable' => false,
        'constructor' => [
            // Monitor these directories
            'monitorDir' => array_merge([
                app_path(),
                config_path(),
                base_path() . '/process',
                base_path() . '/support',
                base_path() . '/resource',
                base_path() . '/.env',
            ], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')),
            // Files with these suffixes will be monitored
            'monitorExtensions' => [
                'php', 'html', 'htm', 'env'
            ],
            'options' => [
                'enable_file_monitor' => !in_array('-d', $argv) && DIRECTORY_SEPARATOR === '/',
                'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
            ]
        ]
    ],
    // 定时清除没使用的附件
	'clearFile'    => [
        'handler' => app\process\ClearFile::class,
    ],
    // 定时清除临时文件
	'tmpFile'    => [
        'handler' => app\process\TmpFile::class,
    ]
];