怎样在 Nest

lxf2023-05-21 01:10:06

我正参与「程序编写·启航计划」

文件传送是 Web 应用软件中常用的作用之一。Nest.js 最底层的 HTTP 架构是 Express,它拥有很多强悍的消息中间件来达到各项功能。

本文详细介绍怎样在 Nest.js 中依靠 multer 消息中间件来达到文件传送的功效。

multer 消息中间件

Multer 消息中间件由 Express 精英团队制作,专门用于解决文件传送,它和 Express 架构密切集成化,在 Nest.js 中大部分都是应用 multer 去完成文件传送的功效。

Multer 的使用方法比较简单,只需简单两行配备,就可以做到文件传送最常见的要求,例如限定文件属性,尺寸,并且支持多文件传送。

Multer 是由分析请求 multipart/form-data 数据信息,从这当中提取文件并把它储存指定位置或分布式存储中。它提供多种数据存储方式,比如系统盘、云计算存储服务等。

复位新项目

最先应用 Nest CLI 创建项目:

$ nest new nest-upload

再进入到项目目录,组装下必须的依赖性:

$ pnpm add multer
$ pnpm add -D @types/multer

@types/multer 是 multer 消息中间件模块种类申明包,能够提供获更加好的类型安全。

它提供了一个 Express.Multer.File 种类,表明上传文档

配备 Multer 消息中间件

从内置 @nestjs/platform-express 导进 MulterModule 控制模块,它所提供的 register 方式可接受一系列这个选项,去完成 multer 消息中间件配置

// app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import * as path from 'path';

@Module({
 imports: [
  MulterModule.register({
   storage: diskStorage({
    // 特定文档存储文件目录
    destination: path.join(__dirname, '../uploads'),
    // 根据时间格式来重新命名上传文件夹名称
    filename: (_, file, callback) => {
     const fileName = `${
      new Date().getTime()   path.extname(file.originalname)
     }`;
     return callback(null, fileName);
     },
    }),
   }),
  ],
 controllers: [AppController],
 providers: [AppService],
})
export class AppModule {}

文件传送控制板

在 app.controller.ts 中,添加一个解决文件传送请求控制板方式,应用 @Post 装饰器特定解决 POST 请求方式,应用 @UseInterceptors@FileInterceptor 装饰器来处理文件传送。FileInterceptor 应用名称是 'file' 的字段名来接受上传文档。

import { Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import { FileInterceptor } from '@nestjs/platform-express';

@Controller()
export class AppController {
 constructor(private readonly appService: AppService) {}

 @Post('upload')
 @UseInterceptors(FileInterceptor('file'))
 async uploadFile(
  @UploadedFile() file: Express.Multer.File,
  ): Promise<{ url: string }> {
  const fileUrl = await this.appService.uploadFile(file);
  return { url: fileUrl };
  }
}

该控制板方式最后回到一个包括文档 Url 的对象,回应给手机客户端。手机客户端能通过这一 URL 去浏览文档网络资源。

建立文件传送服务

在 app.service.ts 中创建一个服务来解决文件传送的思路。

import { Injectable } from '@nestjs/common';
import { MulterDiskUploadedFiles } from '@nestjs/platform-express';
import * as path from 'path';

@Injectable()
export class FileUploadService {
 async uploadFile(file: Express.Multer.File): Promise<string> {
  // 到这儿实际上文档早已上传至网络服务器当地了,必须要有后续存放要求,例如要进传入云计算存储服务中,会在这里再次解决

  // 回到文档URL
  return `http://localhost/uploads/${file.filename}`;
  }
}

测试接口

应用 ApiPost 等设备来测试一下插口,根据推送 POST 要求到 /upload 路由器来检测文件传送作用。应用一个名为 'file' 文件字段名,来包括要上传文档。

怎样在 Nest

开启当地工程项目的网站根目录,的确有一个 uploads 文件目录,里边储放了刚上传文档:

怎样在 Nest

总结

文中简要介绍了怎样在 Nest 中依靠 multer 消息中间件去完成文件传送的功效,完成比较简单,multer 还提供了多文件传送,自定存储芯片等实用的作用,大伙儿可以尝试一下。

本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!