文件上传在后台管理系统是一个比较常见也是一个比较有难度的操作, midway在3.0时提供了文件上传功能 但是在2.0却没有,因为只能使用egg.js的context来获取文件流,从而上传文件
安装依赖
代码语言:javascript复制npm i @midwayjs/cos --save
引入组件
首先,引入 组件,在 configuration.ts
中导入:
import { Configuration } from '@midwayjs/decorator';
import * as cos from '@midwayjs/cos';
import { join } from 'path';
@Configuration({
imports: [
cos, // 导入 cos 组件
],
importConfigs: [join(__dirname, 'config')],
})
export class ContainerLifeCycle {}
Copy
配置
比如:
单客户端配置
代码语言:javascript复制export const cos = {
client: {
secretId: '***********',
secretKey: '***********',
},
};
Copy
多个客户端配置,需要配置多个
代码语言:javascript复制export const cos = {
clients: {
instance1: {
secretId: '***********',
secretKey: '***********',
},
instance2: {
secretId: '***********',
secretKey: '***********',
},
},
};
Copy
更多参数可以查看 cos-nodejs-sdk-v5 文档。
使用 COS 服务
我们可以在任意的代码中注入使用。
代码语言:javascript复制import { Provide, Controller, Inject, Get } from '@midwayjs/decorator';
import { COSService } from '@midwayjs/cos';
@Provide()
export class UserService {
@Inject()
cosService: COSService;
async invoke() {
await this.cosService.sliceUploadFile({
Bucket: 'test-1250000000',
Region: 'ap-guangzhou',
Key: '1.zip',
FilePath: './1.zip'
},
}
}
Copy
可以使用 COSServiceFactory
获取不同的实例。
import { COSServiceFactory } from '@midwayjs/cos';
import { join } from 'path';
@Provide()
export class UserService {
@Inject()
cosServiceFactory: COSServiceFactory;
async save() {
const redis1 = await this.cosServiceFactory.get('instance1');
const redis2 = await this.cosServiceFactory.get('instance3');
//...
}
}
在2.0的这个时候就会遇到坑,需要引入egg的context来获取文件流
代码语言:javascript复制 async saveFile() {
const ctx = this.ctx;
const stream = await ctx.getFileStream();
const file = await this.cosService.putObject({
Bucket: 'xxx-1258770926',
Region: 'ap-shanghai',
Key: stream.filename,
Body: stream,
});
}
获取文件流 使用上传小型文件的方式进行上产图片