[NestJS]文件上传、保存到本地、静态资源访问

FileInterceptor 装饰器

使用nestjs提供的装饰器

import { FileInterceptor } from '@nestjs/platform-express'

路由处理

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('addFile')
  @UseInterceptors(FileInterceptor('file'))
  create(@UploadedFile() file: Express.Multer.File) {
    console.log(file)
  }
}

在路由处配置 使用拦截器@UseInterceptors传入FileInterceptor(key)并使用UploadedFile装饰器在request中提取file文件,file的类型为Express.Multer.File,可以在express中导入方便我们编写代码

import {Express} from 'express'

需要注意的是 FileInterceptor 在 @nestjs/platform-express 导入,而UseInterceptors则在@nestjs/common中导入

通过postman调试工具上传一个文件可以在控制台中看到已经获取到了文件
在这里插入图片描述

在这里插入图片描述

文件保存

保存文件我们需要用到 multer 中间件来处理,multer是一个用于处理multipart/form-data类型数据的中间件

npm install multer @types/multer -D -S
import * as multer from 'multer';
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const folderPath = __dirname + '/assets';
    if (!fs.existsSync(folderPath)) {
      fs.mkdirSync(folderPath);
    }
    cb(null, folderPath);
  },
  filename: (req, file, cb) => {
    cb(null, Date.now() + '-' + file.originalname);
  },
});

const storage = multer.diskStorage({ ... });

定义一个名为storage的变量,使用了multer.diskStorage()方法来配置如何存储上传的文件。

destination: (req, file, cb) => { ... }

这定义了文件应该存储在哪里。当一个文件被上传时,这个函数会被调用。

  • const folderPath = join(__dirname, '../asstes');定义了文件应该存储的目录。这里使用的join需要再path中导入(import { join } from 'path'),__dirname是Node.js的全局变量,表示当前执行脚本所在的目录。所以,这里我们是在当前目录的上一级目录下创建一个名为assets的文件夹来存储上传的文件。
  • if (!fs.existsSync(folderPath))为了程序的健壮性,可以使用fs.existsSync()检查该文件夹是否存在。如果不存在则创建
  • cb(null, folderPath);: 这是回调函数,告诉multer文件应该存储在哪个目录。

filename: (req, file, cb) => { ... }定义了上传的文件应该如何命名。

  • cb(null, Date.now() + '-' + file.originalname);

配置好之后结合上面代码我们把配置传入给FileInterceptor的第二个参数,这样代码就变成了

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const folderPath = join(__dirname, '../assets');
    if (!fs.existsSync(folderPath)) {
      fs.mkdirSync(folderPath);
    }
    cb(null, folderPath);
  },
  filename: (req, file, cb) => {
    cb(null, Date.now() + '-' + file.originalname);
  },
});

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('addFile')
  @UseInterceptors(FileInterceptor('file', { storage }))
  create(@UploadedFile() file: Express.Multer.File) {
    console.log(file);
  }
}

使用postman测试一下会发现上传成功之后保存在了dist/assets文件夹下![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dcdf5adfd53b4c588350f6fd8a53db5b.png

配置静态资源访问

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useStaticAssets(join(__dirname, '/assets'), {
    prefix: '/static/', //设置虚拟前缀路径
    maxAge: 1000 * 60, //设置缓存时间
  });
  await app.listen(3000);
}
bootstrap();

如果不设置prefix 则直接访问http://ip:端口/文件保存名字,如设置前缀则需要再文件之前加入前缀名字http://ip:端口/前缀/文件保存名字

在Nest.js中保存图片到本地文件夹可以使用`multer`中间件和`fs`模块。下面是一个示例: 首先,安装所需的依赖: ```bash npm install multer fs-extra ``` 然后,在Nest.js的控制器中添加处理上传图片的路由: ```typescript import { Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; import { v4 as uuidv4 } from 'uuid'; import * as fs from 'fs-extra'; @Controller('upload') export class UploadController { @Post() @UseInterceptors( FileInterceptor('file', { storage: diskStorage({ destination: './uploads', filename: (req, file, cb) => { const uniqueSuffix = uuidv4(); const ext = file.originalname.split('.').pop(); cb(null, `${uniqueSuffix}.${ext}`); }, }), }), ) async uploadFile(@UploadedFile() file: Express.Multer.File) { // 文件已成功上传并保存到本地 // 可以在这里进行其他操作,如数据库记录等 return { filename: file.filename }; } } ``` 在上述代码中,我们使用了`FileInterceptor`来拦截文件上传的请求,并通过`diskStorage`指定存储配置。其中: - `destination` 指定保存文件的目录,这里设为`./uploads`。 - `filename` 可以自定义生成文件名的逻辑,这里使用了UUID作为唯一标识,并保留了原始文件的后缀名。 最后,确保上传文件的目录存在: ```typescript import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import * as fs from 'fs-extra'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 创建上传目录 fs.ensureDirSync('./uploads'); await app.listen(3000); } bootstrap(); ``` 这样,当用户发送POST请求到`/upload`路由时,Nest.js将会处理文件上传并将文件保存到指定的本地目录中。上传成功后,可以进行其他操作,如记录文件信息到数据库等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值