const Router = require('@koa/router'); const fs = require('fs'); const router = new Router({ prefix: '/cloud' }); const util = require('../utils/util'); const sdk = require('@baiducloud/sdk'); const Minio = require('minio'); const OSS = require('ali-oss'); const imgcloud = require('../service/imgcloud.service'); const config = require('../config'); /** * 图片云服务API接口 */ // 上传cdn文件 router.post('/upload/files', async (ctx) => { try { const file = ctx.request.files.file; const { userId, userName } = util.decodeToken(ctx); let key = `cloud/${userId}/${file.newFilename}`; const buffer = fs.readFileSync(file.filepath); let client = null; if (config.OSS_TYPE === 'minio') { // 创建 MinIO 客户端 client = new Minio.Client({ endPoint: config.OSS_ENDPOINT, port: config.OSS_PORT, // MinIO 默认端口 useSSL: config.OSS_USESSL, // 如果使用 HTTPS,请设置为 true accessKey: config.OSS_ACCESSKEY, secretKey: config.OSS_ACCESSKEYSECRET, }); } else if (config.OSS_TYPE === 'baidu') { const ossConfig = { endpoint: config.OSS_ENDPOINT, //传入Bucket所在区域域名 credentials: { ak: config.OSS_ACCESSKEY, //您的AccessKey sk: config.OSS_ACCESSKEYSECRET, //您的SecretAccessKey }, }; client = new sdk.BosClient(ossConfig); } else { client = new OSS({ // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: config.OSS_REGION, // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 accessKeyId: config.OSS_ACCESSKEY, accessKeySecret: config.OSS_ACCESSKEYSECRET, authorizationV4: true, // 填写Bucket名称。 bucket: config.OSS_BUCKET, }); } if (config.OSS_TYPE === 'aliyun') { await client.put(key, buffer); } else { await client.putObject(config.OSS_BUCKET, key, buffer, { 'Content-Type': 'image/png', // 添加http header 'Cache-Control': 'public, max-age=31536000', // 指定缓存指令 'x-bce-acl': 'public-read', }); } // 删除临时文件 fs.unlink(file.filepath, (err) => { if (err) { return; } }); let url = `${config.OSS_CDNDOMAIN}/${key}`; if (config.OSS_TYPE === 'minio') { url = `${config.OSS_USESSL ? 'https://' : 'http://'}${config.OSS_ENDPOINT}:${config.OSS_PORT}/${config.OSS_BUCKET}/${key}`; } else if (config.OSS_TYPE === 'baidu') { if (config.OSS_CDNDOMAIN) { url = `${config.OSS_CDNDOMAIN}/${key}`; } else { url = `${config.OSS_ENDPOINT}/${key}`; } } else { if (config.OSS_CDNDOMAIN) { url = `${config.OSS_CDNDOMAIN}/${key}`; } else { url = `https://${config.OSS_BUCKET}.${config.OSS_REGION}.aliyuncs.com/${key}`; } } await imgcloud.create(userId, userName, file.originalFilename, file.newFilename, file.mimetype, file.size, url); util.success(ctx, { name: file.originalFilename, size: file.size, type: file.mimetype, url, }); } catch (error) { fs.unlink(file.filepath, (err) => { if (err) { return; } }); util.fail(ctx, JSON.stringify(error)); } }); // cdn列表 router.get('/list', async (ctx) => { const { userId } = util.decodeToken(ctx); const { pageNum = 1, pageSize = 24 } = ctx.request.query; const list = await imgcloud.list(userId, pageNum, pageSize); const { total } = await imgcloud.listCount(userId); util.success(ctx, { list, total, pageSize: +pageSize, pageNum: +pageNum, }); }); // 文件删除 router.post('/delete', async (ctx) => { const { userId } = util.decodeToken(ctx); const { id } = ctx.request.body; if (!id) { return ctx.throw(400, 'ID不能为空'); } await imgcloud.delete(id, userId); util.success(ctx); }); module.exports = router;