img.cloud.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. const Router = require('@koa/router');
  2. const fs = require('fs');
  3. const router = new Router({ prefix: '/cloud' });
  4. const util = require('../utils/util');
  5. const sdk = require('@baiducloud/sdk');
  6. const Minio = require('minio');
  7. const OSS = require('ali-oss');
  8. const imgcloud = require('../service/imgcloud.service');
  9. const config = require('../config');
  10. /**
  11. * 图片云服务API接口
  12. */
  13. // 上传cdn文件
  14. router.post('/upload/files', async (ctx) => {
  15. try {
  16. const file = ctx.request.files.file;
  17. const { userId, userName } = util.decodeToken(ctx);
  18. let key = `cloud/${userId}/${file.newFilename}`;
  19. const buffer = fs.readFileSync(file.filepath);
  20. let client = null;
  21. if (config.OSS_TYPE === 'minio') {
  22. // 创建 MinIO 客户端
  23. client = new Minio.Client({
  24. endPoint: config.OSS_ENDPOINT,
  25. port: config.OSS_PORT, // MinIO 默认端口
  26. useSSL: config.OSS_USESSL, // 如果使用 HTTPS,请设置为 true
  27. accessKey: config.OSS_ACCESSKEY,
  28. secretKey: config.OSS_ACCESSKEYSECRET,
  29. });
  30. } else if (config.OSS_TYPE === 'baidu') {
  31. const ossConfig = {
  32. endpoint: config.OSS_ENDPOINT, //传入Bucket所在区域域名
  33. credentials: {
  34. ak: config.OSS_ACCESSKEY, //您的AccessKey
  35. sk: config.OSS_ACCESSKEYSECRET, //您的SecretAccessKey
  36. },
  37. };
  38. client = new sdk.BosClient(ossConfig);
  39. } else {
  40. client = new OSS({
  41. // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  42. region: config.OSS_REGION,
  43. // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  44. accessKeyId: config.OSS_ACCESSKEY,
  45. accessKeySecret: config.OSS_ACCESSKEYSECRET,
  46. authorizationV4: true,
  47. // 填写Bucket名称。
  48. bucket: config.OSS_BUCKET,
  49. });
  50. }
  51. if (config.OSS_TYPE === 'aliyun') {
  52. await client.put(key, buffer);
  53. } else {
  54. await client.putObject(config.OSS_BUCKET, key, buffer, {
  55. 'Content-Type': 'image/png', // 添加http header
  56. 'Cache-Control': 'public, max-age=31536000', // 指定缓存指令
  57. 'x-bce-acl': 'public-read',
  58. });
  59. }
  60. // 删除临时文件
  61. fs.unlink(file.filepath, (err) => {
  62. if (err) {
  63. return;
  64. }
  65. });
  66. let url = `${config.OSS_CDNDOMAIN}/${key}`;
  67. if (config.OSS_TYPE === 'minio') {
  68. url = `${config.OSS_USESSL ? 'https://' : 'http://'}${config.OSS_ENDPOINT}:${config.OSS_PORT}/${config.OSS_BUCKET}/${key}`;
  69. } else if (config.OSS_TYPE === 'baidu') {
  70. if (config.OSS_CDNDOMAIN) {
  71. url = `${config.OSS_CDNDOMAIN}/${key}`;
  72. } else {
  73. url = `${config.OSS_ENDPOINT}/${key}`;
  74. }
  75. } else {
  76. if (config.OSS_CDNDOMAIN) {
  77. url = `${config.OSS_CDNDOMAIN}/${key}`;
  78. } else {
  79. url = `https://${config.OSS_BUCKET}.${config.OSS_REGION}.aliyuncs.com/${key}`;
  80. }
  81. }
  82. await imgcloud.create(userId, userName, file.originalFilename, file.newFilename, file.mimetype, file.size, url);
  83. util.success(ctx, {
  84. name: file.originalFilename,
  85. size: file.size,
  86. type: file.mimetype,
  87. url,
  88. });
  89. } catch (error) {
  90. fs.unlink(file.filepath, (err) => {
  91. if (err) {
  92. return;
  93. }
  94. });
  95. util.fail(ctx, JSON.stringify(error));
  96. }
  97. });
  98. // cdn列表
  99. router.get('/list', async (ctx) => {
  100. const { userId } = util.decodeToken(ctx);
  101. const { pageNum = 1, pageSize = 24 } = ctx.request.query;
  102. const list = await imgcloud.list(userId, pageNum, pageSize);
  103. const { total } = await imgcloud.listCount(userId);
  104. util.success(ctx, {
  105. list,
  106. total,
  107. pageSize: +pageSize,
  108. pageNum: +pageNum,
  109. });
  110. });
  111. // 文件删除
  112. router.post('/delete', async (ctx) => {
  113. const { userId } = util.decodeToken(ctx);
  114. const { id } = ctx.request.body;
  115. if (!id) {
  116. return ctx.throw(400, 'ID不能为空');
  117. }
  118. await imgcloud.delete(id, userId);
  119. util.success(ctx);
  120. });
  121. module.exports = router;