likeadmin增加文件上传类型

teaxia
2024-02-05 / 0 评论 / 38 阅读 / 正在检测是否收录...

likeadmin我发现是一个非常好用,并且能快速上手的整套后台程序。它使用了thinkphp6+vue的架构,而且还可以使用后台的代码生成工具,快速的创建后台管理表单,大大节省了时间。
在使用这个后台框架的时候,里面自带了一个“素材中心”。但是这个“素材中心”它限制了上传的类型,只能上传图片和视频两种类型。但是如果我们需要上传其它文件,并且也想通过这个“素材中心”来进行管理的话,我们就需要去改动代码了。
主要改动的PHP文件,涉及3个文件,分别是以下4个:

  1. config/project.php
  2. app/common/service/UploadService.php
  3. app/common/service/storage/engine/Server.php
  4. app/adminapi/controller/UploadController.php
    首先,我们先找到project.php文件,我们可以找到
'file_files' => [
    'xls', 'xlsx'
],

然后在后面加上

// 文件上传限制 (文件)
'file_files' => [
    'xls', 'xlsx'
],

然后找到第二个文件UploadService.php
我们可以找到最后的“视频上传”方法,然后在后面加上文件上传的方法

public static function files($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/files')
{
    try {
        $config = [
            'default' => ConfigService::get('storage', 'default', 'local'),
            'engine'  => ConfigService::get('storage') ?? ['local'=>[]],
        ];
        
        // // 2、执行文件上传
        $StorageDriver = new StorageDriver($config);
        $StorageDriver->setUploadFile('file');
        
        $fileName = $StorageDriver->getFileName();
        $fileInfo = $StorageDriver->getFileInfo();
        
        // 校验上传文件后缀
        if (!in_array(strtolower($fileInfo['ext']), config('project.file_files'))) {
            throw new Exception("文件不允许上传". $fileInfo['ext'] . "文件");
        }
        
        // 上传文件
        $saveDir = $saveDir . '/' .  date('Ymd');
        if (!$StorageDriver->upload($saveDir)) {
            throw new Exception($StorageDriver->getError());
        }

        // 3、处理文件名称
        if (strlen($fileInfo['name']) > 128) {
            $name = substr($fileInfo['name'], 0, 123);
            $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
            $fileInfo['name'] = $name . $nameEnd;
        }

        // 4、写入数据库中
        $file = File::create([
            'cid'         => $cid,
            'type'        => FileEnum::FILE_TYPE,
            'name'        => $fileInfo['name'],
            'uri'         => $saveDir . '/' . str_replace("\\","/", $fileName),
            'source'      => $source,
            'source_id'   => $sourceId,
            'create_time' => time(),
        ]);

        // 5、返回结果
        return [
            'id'   => $file['id'],
            'cid'  => $file['cid'],
            'type' => $file['type'],
            'name' => $file['name'],
            'uri'  => FileService::getFileUrl($file['uri']),
            'url'  => $file['uri']
        ];

    } catch (Exception $e) {
        throw new Exception($e->getMessage());
    }
}

添加好了以后,找到最后一个文件Server.php
在大约45行的样子,找到

 $limit = array_merge(config('project.file_image'), config('project.file_video'));

这行代码,然后修改成

$limit = array_merge(config('project.file_image'), config('project.file_video'), config('project.file_files'));

文件UploadController.php
在64行位置public function video()方法的后面,添加

/**
 * @notes 上传文件
 * @return Json
 * @author teaxia
 * @date 2024/01/11 0:15
 */
public function files()
{
    try {
        $cid = $this->request->post('cid', 0);
        $result = UploadService::files($cid);
        return $this->success('上传成功', $result);
    } catch (Exception $e) {
        return $this->fail($e->getMessage());
    }
}

至此,php部分修改完成。
前端部分呢,找到
src/views/material/index.vue文件
在tabsMap里面添加

{
    type: 'files',
    name: '文件'
}

src/components/material/index.vue文件
找到56行

<upload v-if="type == 'video'" class="mr-3" :data="{ cid: cateId }" :type="type" :show-progress="true"
    @change="refresh">
    <el-button type="primary">本地上传</el-button>
</upload>

在后面添加

<upload v-if="type == 'files'" class="mr-3" :data="{ cid: cateId }" :type="type" :show-progress="true"
    @change="refresh">
    <el-button type="primary">本地上传</el-button>
</upload>

找到276行左右

case 'video':
    return 20

在后面添加

case 'files':
    return 30
0

评论 (0)

取消