index.mjs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import Router from '@koa/router';
  2. import { koaBody } from 'koa-body';
  3. import { copyFile, rm, access, mkdir } from 'node:fs/promises';
  4. import { UPLOAD_DIR, STATIC } from '../app.config.mjs';
  5. const router = new Router();
  6. // 通过router实例的一些方法 比如 get、post等去定义 对应请求方法的路由
  7. router
  8. .get('/', (ctx) => {
  9. ctx.body = 'Koa App.';
  10. })
  11. .put(
  12. '/upload',
  13. koaBody({
  14. multipart: true,
  15. formidable: {
  16. keepExtensions: true,
  17. uploadDir: UPLOAD_DIR, // 设置上传文件的最终位置
  18. },
  19. onError(err, ctx) {
  20. ctx.body = {
  21. code: 1,
  22. msg: err,
  23. };
  24. },
  25. }),
  26. async (ctx) => {
  27. let filename = ctx.request.files.file.newFilename;
  28. let srcFile = `./${UPLOAD_DIR}/${filename}`;
  29. let destFile = srcFile;
  30. // 获取 请求体 中 除了file文件之外的其他数据
  31. const { folder } = ctx.request.body;
  32. // 如果用户在上传文件时 指定了目标文件夹
  33. if (folder) {
  34. // 1 将默认上传位置的文件 拷贝到 目标的文件夹下
  35. destFile = `./${UPLOAD_DIR}/${folder}/${filename}`;
  36. try {
  37. // 先确保destFile的文件夹都真实存在
  38. let isExist = await access(`./${UPLOAD_DIR}/${folder}`).catch(
  39. () => false
  40. );
  41. // isExist 就是 undefined 或者 false
  42. if (isExist == false) {
  43. // 如果不存在 就创建
  44. await mkdir(`./${UPLOAD_DIR}/${folder}`, { recursive: true });
  45. }
  46. await copyFile(srcFile, destFile);
  47. // 2 成功后 删除默认位置的文件
  48. await rm(srcFile);
  49. } catch (error) {
  50. console.error(error);
  51. }
  52. }
  53. // 给客户端响应数据
  54. ctx.body = {
  55. code: 0,
  56. data: {
  57. path: `${UPLOAD_DIR.replace(STATIC, '')}/${folder}/${filename}`,
  58. filename,
  59. },
  60. msg: '上传成功',
  61. };
  62. }
  63. );
  64. export default router;