不啰嗦 直接上步骤
步骤1.开发环境配置
项目需要node.js 做前端支撑 官网下载地址:
http://nodejs.cn/download/
根据自己需要下载对应的版本,我下载的是windows系统64位的版本。
包下载好后 进行安装,安装步骤在此省略...
测试是否安装成功
如果是window 按住键盘Win+R 输入cmd 在终端里面输入
node -v
npm-v
如果安装成功会出现安装的node npm 的软件版本号,否则为安装失败。如下图
因为一些原因 npm 下载包巨慢 你懂得,所以我们这里选用淘宝镜像 打开终端 运行如下命令:
npm install -g cnpm --registry=https://registry.npm.taobao.org
安装好后 运行命令:
cnpm -v
cnpm@9.2.0 (C:\Users\King\AppData\Roaming\npm\node_modules\cnpm\lib\parse_argv.js)
npm@9.8.1 (C:\Users\King\AppData\Roaming\npm\node_modules\cnpm\node_modules\npm\index.js)
node@18.17.0 (D:\Program Files\node\node.exe)
npminstall@7.11.1 (C:\Users\King\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\index.js)
prefix=C:\Users\King\AppData\Roaming\npm
win32 x64 10.0.22621
registry=https://registry.npmmirror.com
步骤2.构想分片上传逻辑,编写逻辑代码(核心)
基本思路:
1)前端侧 :前端上传文件,根据分片大小,自动计算出整个文件的分片数量,以及分片二进制文件,以及整个文件的md5值,以及分片文件md5值,传与后端,后端处理完后,根据上传分片的进度以及后端返回状态,判断整个文件是否传输完毕,完毕后,前端展示完成进度。结束整个分片上传逻辑。
2)后端PHP侧:后端接收前端传过来的数据,包括文件名,文件md5,分片信息,然后将分片文件信息存储到redis 有序集合中,其中key为整个文件的md5 ,待所有分片文件都上传完后,根据顺序,然后将文件整合存储,然后完成整个文件分片上传逻辑。
下面我们来编写相关代码 :
前置条件 我们已经安装了此环境 环境如下:
运行环境 | 版本 |
Linux | centos 7.7.1908 |
PHP | 7.4.19 |
redis | 6.2.1 |
swoole扩展 | 4.8.13 |
eayswoole | 3.5.1 |
首先我们需要使用到redis 部分代码如下:
首先配置redis 相关信息 此处我们将配置文件放在根目录下Config 目录 Redis.php中 代码如下:
[root@web1 easyswoole]# cd Config
ll
[root@web1 Config]# ll
总用量 28
-rw-r--r-- 1 root root 8725 9月 23 19:09 Common.php
-rw-r--r-- 1 root root 1450 9月 4 21:21 Iam.php
-rw-r--r-- 1 root root 3027 8月 29 18:47 Mimes.php
-rw-r--r-- 1 root root 1795 9月 4 19:21 Mysql.php
-rw-r--r-- 1 root root 948 9月 23 17:50 Redis.php
[root@web1 Config]# vim Redis.php
<?php
return [
'redis' => [
# 默认redis 配置
'REDIS' => [
'host' => '127.0.0.1',
'port' => '6390',
'auth' => 'yisa123456q',
'db' => '1',
'serialize' => 0
],
# token存储redis,用来设置接口权限
'REDIS_LOCAL' => [
'host' => '127.0.0.1',
'port' => '6390',
'auth' => 'YISA123456Q',
'db' => 5,
'serialize' => 0
],
]
];
配置上传目录 后续Upload.php 控制器需要读取 Config/Common.php 代码如下:
<?php
use EasySwoole\EasySwoole\Config;
defined('BASEPATH') or define('BASEPATH', dirname(__FILE__) . '/../..');
defined('WEB_IP') or define('WEB_IP', '192.168.1.1');
return [
// 此处省略其他配置信息 .....
'WEB_IP' => WEB_IP,
'WEB_PATH' => BASEPATH,
'UPLOAD' => [
'tmp_dir' => '/uploads_tmp/',//分片文件缓存目录
'upload_dir' => '/uploads/',//文件现在目录
],
// 此处省略其他配置信息 .....
];
接下来需要定义连接池 直接上代码
cd App/Pool
touch RedisPool.php
<?php
/**
* redis连接池配置处理
*/
namespace App\Pool;
use EasySwoole\Pool\Config;
use EasySwoole\Redis\Config\RedisConfig;
use EasySwoole\Redis\Redis;
class RedisPool extends \EasySwoole\Pool\AbstractPool {
protected $redis_config;
public function __construct(Config $conf, RedisConfig $redis_config) {
parent::__construct($conf);
$this->redis_config = $redis_config;
}
protected function createObject() {
return new Redis($this->redis_config);
}
}
接下来,在入口文件EasySwooleEvent.php 注册redis 连接池
<?php
namespace EasySwoole\EasySwoole;
use App\Pool\RedisPool;
use EasySwoole\Redis\Config\RedisConfig;
class EasySwooleEvent implements Event {
public static function mainServerCreate(EventRegister $register) {
//其他逻辑 此处省略....
//注册redis
self::initRedis();