13_文件上传&静态目录

简介: 13_文件上传&静态目录

通过Nest.js我们可以实现文件上传功能,这样就可以把老婆们都存到服务器里来了,上传功能需要借助multer包实现

  1. 安装multer及其类型声明包

npm install multer

npm install @types/multer

  1. 生成一个upload文件夹用于提供上传服务

nest g res upload

文件上传

设置默认选项

在upload文件夹中设置一些默认选项,通过调用MulterModule中的register方法实现。如果需要异步处理文件上传,可以使用registerAsync

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 { extname, join } from 'path';
@Module({
  // 通过imports的方式进行注册
  imports:[MulterModule.register({
    storage:diskStorage({
      // 存放文件的目录
      destination:join(__dirname,'../image'),
      // 重命名文件
      filename:(req,file,callback) => {
        // 使用时间戳 + 文件名称的方式来存储文件
        callback(null,`${new Date().getTime()}` + extname(file.originalname))
      }
    })
  })],
  controllers: [UploadController],
  providers: [UploadService],
})
export class UploadModule {}

MulterModule.register接收一个配置对象,这里列出所有受支持的选项(来源:Multer中文文档

dest or storage

在哪里存储文件

fileFilter

文件过滤器,控制哪些文件可以被接受

limits

限制上传的数据

preservePath

保存包含文件名的完整文件路径

其中,storage需要使用diskStorage函数生成,diskStorage函数同样接收一个配置对象,有两个可用的选项destinationfilename。详细信息如下:

  1. destination用来确定文件的存储位置,其类型可以是和filename一样的函数,也可以是一个字符串。如果没有提供,存储位置将默认为操作系统的临时文件夹。
  2. filename用于确定文件的名称,其类型是一个接收请求信息、文件信息和回调函数的函数。如果没有设置 filename,每个文件将随机设置一个文件名并且没有扩展名
  3. callback的第一个参数是错误信息,第二个是返回的字符串

需要注意的是, Multer不会为文件提供任何扩展名。callback应当返回一个完整的文件名。本例中我们使用extname取出文件的扩展名(.jpg),file.originalname表示用户计算机上文件的完整名称

部署上传服务

在upload.controller.ts中使用FileInterceptor中间件进行部署,该装饰器接收一个字符串类型参数和一个配置对象,字符串要和POST请求体中包含文件的字段名称一致,配置对象和上文MulterModule.register的配置对象格式相同,不过我们这里予以省略

import {
  Controller,
  Post,
  UseInterceptors,
  UploadedFile,
} from '@nestjs/common';
import { UploadService } from './upload.service';
import { CreateUploadDto } from './dto/create-upload.dto';
import { UpdateUploadDto } from './dto/update-upload.dto';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}
  @Post()
  // @UseInterceptors指示要注册哪个中间件
  @UseInterceptors(FileInterceptor('file'))
  // @UploadedFile从request中取出file
  create(@UploadedFile() file: Express.Multer.File) {
    console.log(file);
    return true;
  }
}

以上,如果文件上传成功则控制台会打印出文件的信息并返回true,我们可以使用ApiFox测试一下

无需关注校验信息(迫真),上传已经成功了。注意参数名一定要是file(和FileInterceptor中定义的一致)

静态目录

和express中的express.static()相同,nest.js也提供了对应方法解决创建静态目录的问题,并且非常方便

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
// 引入NestExpressApplication接口
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
async function bootstrap() {
  // 传入泛型获取代码提示
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  // 设置静态目录路径
  app.useStaticAssets(join(__dirname,'..', 'public')
  await app.listen(3000);
}
bootstrap();

很简单,只需要操作main.ts即可。使用app.useStaticAssets()方法创建静态目录,该方法接收两个参数,第一个是字符串,对应服务器上的资源URL,第二个是一个配置对象,可以在里面定义虚拟路径等参数

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
// 引入NestExpressApplication接口
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
async function bootstrap() {
  // 传入泛型获取代码提示
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  // 设置静态目录路径
  app.useStaticAssets(join(__dirname,'..', 'public'),{
    prefix:'/nuohang',
  })
  await app.listen(3000);
}
bootstrap();

对第一个例子,访问http://localhost:3000/1680706936282.jpg

对第二个例子,访问http://localhost:3000/nuohang/1680706936282.jpg

目录
相关文章
|
消息中间件 存储 缓存
RabbitMq如何防止消息被重复消费
RabbitMq如何防止消息被重复消费
1799 0
|
2月前
|
机器学习/深度学习 缓存 算法
2025年华为杯A题|通用神经网络处理器下的核内调度问题研究生数学建模|思路、代码、论文|持续更新中....
2025年华为杯A题|通用神经网络处理器下的核内调度问题研究生数学建模|思路、代码、论文|持续更新中....
379 1
|
缓存 前端开发 JavaScript
前端开发的必修课:如何让你的网页在弱网环境下依然流畅运行?
【10月更文挑战第30天】随着移动互联网的普及,弱网环境下的网页性能优化变得尤为重要。本文详细介绍了如何通过了解网络状况、优化资源加载、减少HTTP请求、调整弱网参数和代码优化等方法,提升网页在弱网环境下的加载速度和流畅性,从而改善用户体验。
663 4
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI系统】AI 框架作用
深度学习通过多层计算模型学习数据中的复杂结构,实现高级别的数据抽象。例如,CNN能从大量图像中学习猫和狗的特征。本文探讨深度学习原理及其计算中AI框架的应用,强调AI框架如何帮助自动求导,简化模型训练过程,以及在实际应用中的作用。
266 3
【AI系统】AI 框架作用
|
9月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
648 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
设计模式 缓存 JavaScript
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
519 0
|
Java
如何捕获和处理 EOFException 异常
EOFException 异常通常在尝试从输入流中读取数据但已到达文件末尾时抛出。要捕获和处理该异常,可以使用 try-catch 语句块,在 catch 块中进行相应的错误处理或提示。例如: ```java try { // 读取数据的代码 } catch (EOFException e) { System.out.println(&quot;已到达文件末尾&quot;); } ```
579 4
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
287 7
|
XML Java 应用服务中间件
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
425 0
|
机器学习/深度学习 人工智能 算法
CV领域再创佳绩!阿里云机器学习平台 PAI 多篇论文入选 ICCV 2023
近期,阿里云机器学习平台PAI发表的多篇论文在ICCV 2023上入选。ICCV是国际计算机视觉大会是由电气和电子工程师协会每两年举办一次的研究大会。与CVPR和ECCV一起,它被认为是计算机视觉领域的顶级会议之一。ICCV 2023将于10月2日至10月6日法国巴黎举办。ICCV汇聚了来自世界各地的学者、工程师和研究人员,分享最新的计算机视觉研究成果和技术进展。会议涵盖了计算机视觉领域的各个方向,包括图像处理、模式识别、机器学习、人工智能等等。ICCV的论文发表和演讲都备受关注,是计算机视觉领域交流和合作的重要平台。