NestJS学习:图片上传、下载

参考

大神的这两篇文章讲的很详细,这里自己也来试一下
小满nestjs(第十三章 nestjs 上传图片-静态目录)

小满nestjs(第十四章 nestjs 下载图片)

上传图片

安装包
需要:multer 和 @nestjs/platform-express,后者nestJs自带了

npm i multer
npm i  @types/multer

创建文件上传模块

nest g res upload

在这里插入图片描述
在upload.module.ts中引入相应的包

import { Module } from '@nestjs/common';
import { UploadService } from './upload.service';
import { UploadController } from './upload.controller';

//文件上传需要的包
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { join, extname } from 'path';

@Module({
  //里面有register 和 registerAsync 两个方法,前者是同步的,后者是异步的
  imports: [MulterModule.register({
    //图片上传完要存放的位置
    storage: diskStorage({
      destination: join(__dirname, '../images'),//存放的文件路径
      filename: (req, file, callback) => {
        //重新定义文件名,file.originalname 文件的原始名称
        // extname 获取文件后缀
        const fileName = `${new Date().getTime() + extname(file.originalname)}`;
        //返回新的名称,参数1是错误,这里用null就好
        return callback(null, fileName)
      }
    }),
  }
  )],
  controllers: [UploadController],
  providers: [UploadService]
})
export class UploadModule { }

重新启动一下项目,可以看到在dist目录下生成了images目录
在这里插入图片描述
使用
修改upload.controller.ts文件

import { Controller, Post,UseInterceptors,UploadedFile } from '@nestjs/common';
import { UploadService } from './upload.service';
// FileInterceptor用于单文件上传,FilesInterceptor用于多文件上传
import {FileInterceptor,FilesInterceptor} from '@nestjs/platform-express'

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}
  @Post('album')
  // UseInterceptors 处理文件的中间件,file是一个标识名
  @UseInterceptors(FileInterceptor('file'))
  // UploadedFile装饰器是用于读取文件的
  upload (@UploadedFile() file) {
    console.log("file:",file)
    return true
  }
}

大佬用的测试工具是:Apifox,可以自行下载。下载完进行如下配置
在这里插入图片描述
参数名必须与:@UseInterceptors(FileInterceptor('file')) 对应
在这里插入图片描述
可以看到返回值与我们在代码里写的返回值是一致的,同时在项目里也可以找到该文件
在这里插入图片描述

配置静态文件的访问

虽然图片已经上传成功了,但是现在还是无法直接访问,还需要配置静态文件的访问

修改main.ts

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(AppModule); // 最初的代码
  const app= await NestFactory.create<NestExpressApplication>(AppModule)
  //配置静态文件访问目录
  app.useStaticAssets(join(__dirname,'images'),{
    prefix:"/files/"
  })
  app.useStaticAssets(join(__dirname,'..','public'),{
    // 配置虚拟路径
    prefix:"/files/"
  })
  await app.listen(3000);
}
bootstrap();

注意: 这里有个坑,大佬没有讲到(当然大佬可能觉得不用讲,但是我这样的小白就遇到了)。如果路径配置的有问题,是无法访问到图片的。

app.useStaticAssets(join(__dirname,'images'),{
    prefix:"/files/"
  })

上面这个是访问根目录下的images文件夹下的图片,这里的根目录是dist目录,是打包后的目录
在这里插入图片描述
在这里插入图片描述

app.useStaticAssets(join(__dirname,'..','public'),{
   // 配置虚拟路径
   prefix:"/files/"
 })

还是以dist目录为根目录,..是上一层目录,所以找的文件夹是
在这里插入图片描述
在这里插入图片描述

下载图片

download 直接下载

import { Controller, Post, UseInterceptors, UploadedFile, Get, Res } from '@nestjs/common';
import { UploadService } from './upload.service';
// FileInterceptor用于单文件上传,FilesInterceptor用于多文件上传
import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'
import type { Response } from 'express'
import {join} from 'path'

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) { }
  @Post('album')
  // UseInterceptors 处理文件的中间件,file是一个标识名
  @UseInterceptors(FileInterceptor('file'))
  // UploadedFile装饰器是用于读取文件的
  upload(@UploadedFile() file) {
    console.log("file:", file)
    return true
  }

  // 文件下载
  @Get('export')
  download(@Res() res: Response) {
    //正常应该是从数据库里获取地址
    const url=join(__dirname,'../images/1675781518442.jpg')
    res.download(url)
  }
}

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值