一、 NestJS file-upload 官方文档

https://docs.nestjs.cn/8/techniques?id=%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0

二、单个、多个文件上传

  1. import { Body, Controller, Get, Post, Render, UseInterceptors, UploadedFile, UploadedFiles } from '@nestjs/common';
  2. import { FileFieldsInterceptor, FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; // 上传文件
  3. import { createWriteStream } from 'fs'; // node 自带的文件模块
  4. import { join } from 'path'; // 使用 join 拼接路径
  5. @Controller('upload')
  6. export class UploadController {
  7. @Get()
  8. @Render('default/upload')
  9. index() {
  10. }
  11. // 单个文件上传
  12. @Post('doAdd')
  13. @UseInterceptors(FileInterceptor('pic')) // pic 是上传文件的name属性
  14. doAdd(@Body() body, @UploadedFile() file) {
  15. console.log(body)
  16. console.log(file) // 上传图片的信息
  17. var writeStream = createWriteStream(join(__dirname, '../../public/upload', `${Date.now()}-${file.originalname}`))
  18. writeStream.write(file.buffer)
  19. return '上传图片成功'
  20. }
  21. // 多个文件上传name属性一样
  22. @Post('doAdd')
  23. @UseInterceptors(FilesInterceptor('pic')) // 上传多个文件时,如果name属性一样就直接使用FilesInterceptor即可
  24. doAdds1(@Body() body, @UploadedFiles() files) {
  25. // files 返回的是个数组
  26. for (const file of files) { // 遍历数组
  27. const writeImage = createWriteStream(join(__dirname, '../../', 'public/upload', `${body.title}-${Date.now()}-${file.originalname}`));
  28. writeImage.write(file.buffer);
  29. }
  30. return '上传图片成功'
  31. }
  32. // 多个文件上传name属性不一样
  33. @Post('doAdds')
  34. @UseInterceptors(FileFieldsInterceptor([ // 上传多个文件时,如果name属性不一样就直接使用FileFieldsInterceptor即可
  35. { name: 'pic1', maxCount: 1 },
  36. { name: 'pic2', maxCount: 1 },
  37. { name: 'pic3', maxCount: 1 },
  38. ]))
  39. doAdds2(@Body() body, @UploadedFiles() files) {
  40. // files 返回的是个对象
  41. for (const i in files) { // 遍历对象
  42. const file = files[i][0]
  43. const writeImage = createWriteStream(join(__dirname, '../../', 'public/upload', `${body.title}-${Date.now()}-${file.originalname}`));
  44. writeImage.write(file.buffer);
  45. }
  46. return '上传图片成功'
  47. }
  48. }

三、注意事项

  • 上传图片的时候 From 表单中需要配置 enctype=”multipart/form-data”
    1. <form action="upload/doAdd" method="post" enctype="multipart/form-data">
    2. <input type="text" name="title1" id="" placeholder="新闻标题"><br><br>
    3. <input type="text" name="keywords" id="" placeholder="关键词"><br><br>
    4. <input type="text" name="author" id="" placeholder="作者"><br><br>
    5. <input type="file" name="pic" id=""><br><br>
    6. <input type="submit" value="提交">
    7. </form>