nest笔记四:文件的上传与下载

nest是基于express之上的,所以,其文件上传和下载的功能,实际上就是express的功能。

下载

文件下载有两种,一个是sendFile,一个是download。

  • 其实download会在浏览器显示另存为…,它主要是在响应头里面加上了Content-Disposition: attachment; filename=“xxxx” 告知浏览器需要下载。我用apifox测试,中文文件名乱码。抽空我再解决这个问题。
  • 而sendFile会在浏览器显示文件,它主要是在Content-Type根据文件名的扩展名设置响应HTTP标头字段。

上传

  • nest内建使用express的multer这个中间件,提交文件的格式是multipart/form-data,使用的http方法是post.
  • Multer 无法处理非多部分格式(multipart/form-data)的数据
  • 使用之前,先安装定义包:$ npm i -D @types/multer
  • 官方参考:https://docs.nestjs.com/techniques/file-upload

文件上传 nest有四种模式

  • 文件上传虽然有多种模式,但是提交的文件要求是一个字段对一个文件,否则不能识别
    如下图:虽然file字段对应多个文件,上传后这个字段不能被识别

单个字段单一文件上传

  • 例如form-data里面的 file字段上传了一个文件
    @Post('up')@HttpCode(HttpStatus.OK)@UseInterceptors(FileInterceptor('file'))public up(@UploadedFile() file: Express.Multer.File, @Body() body) {const r = new XCommonRet<number>();do {//delete file.buffer;log.info(JSON.stringify(file, null, 2));log.info(JSON.stringify(body, null, 2));} while (false);return r;}

单个字段多文件上传

  • 例如form-data里面的,有多个file字段,每个字段对应一个文件
  • 注意,这个时候 装饰器FileInterceptor => FilesInterceptor, UploadedFile => UploadedFiles 都是复数的形式
   @Post('upmult')@HttpCode(HttpStatus.OK)@UseInterceptors(FilesInterceptor('file'))public upMult(@UploadedFiles() files: Express.Multer.File[], @Body() body) {const r = new XCommonRet<number>();do {let cnt = 0;for (const f of files) {delete f.buffer;cnt++;log.info(`[${cnt}]=${JSON.stringify(f)}`);}log.info(JSON.stringify(body, null, 2));} while (false);return r;}

多个字段,每个字段多文件上传

  • 例如form-data里面的,有多个file字段和多个pic字段,每个字段对应一个文件
  • 注意,这个时候,使用的装饰器又所不同 FilesInterceptor => FileFieldsInterceptor,UploadedFiles还是不变,不过配置类型变了 { file?: Express.Multer.File[]; pic?: Express.Multer.File[] }
    @Post('upmultex')@HttpCode(HttpStatus.OK)@UseInterceptors(FileFieldsInterceptor([{ name: 'file' }, { name: 'pic' }]))public upMultEx(@UploadedFiles() files: { file?: Express.Multer.File[]; pic?: Express.Multer.File[] }, @Body() body) {const r = new XCommonRet<number>();do {let cnt = 0;files?.file?.forEach((f) => {delete f.buffer;cnt++;log.info(`[${cnt}]=${JSON.stringify(f)}`);});files?.pic?.forEach((f) => {delete f.buffer;cnt++;log.info(`[${cnt}]=${JSON.stringify(f)}`);});log.info(JSON.stringify(body, null, 2));} while (false);return r;}

任意字段文件上传

  • 顾名思义所有的上传的字段,是文件的,都能够取到
  • 这个时候装饰器变成了AnyFilesInterceptor

   @Post('upany')@HttpCode(HttpStatus.OK)@UseInterceptors(AnyFilesInterceptor())public upAny(@UploadedFiles() files: Express.Multer.File[], @Body() body) {const r = new XCommonRet<number>();do {let cnt = 0;for (const f of files) {delete f.buffer;cnt++;log.info(`[${cnt}]=${JSON.stringify(f)}`);}log.info(JSON.stringify(body, null, 2));} while (false);return r;}

实现的代码

  • 下面是实现的具体代码
    // 在当前工程目录下面,输入命令:nest g co upload// 我们就创建了一个src/upload/upload/controller.ts// 这里是文件的源码import {Body,Controller,Post,Res,UploadedFile,UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { XCommonRet } from 'xmcommon';
import { Response } from 'express';@Controller('upload')
export class UploadController {@Post('up')@UseInterceptors(FileInterceptor('file'))public up(@UploadedFile() file: Express.Multer.File, @Body() body) {const r = new XCommonRet<number>();do {//console.log(file);console.log(body);} while (false);return r;}@Post('download')public download(@Res() res: Response) {const filePath ='c:\\temp\\测试.zip';res.download(filePath, (err) => {if (!err) {console.log('success', 'download', filePath);return;}console.error(err);res.send({ err: -1, msg: String(err) });});}@Post('view')public view(@Res() res: Response) {const filePath ='c:\\temp\\测试.jpg';res.sendFile(filePath, (err) => {if (!err) {console.log('success', 'view', filePath);return;}console.error(err);res.send({ err: -1, msg: String(err) });});}
}

相关文章列表

  • nest笔记一:创建工程并配置vscode调试环境
  • nest笔记二:使用log4js替换nest默认日志
  • nest笔记三:使用全局拦截器打印请求日志
  • nest笔记四:文件的上传与下载

# nest笔记四:文件的上传与下载相关推荐

  1. 文件的上传和下载---学习笔记

    文件上传原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的. JSP中上传文 ...

  2. nginx java文件上传_Nginx实现文件的上传和下载

    文件的上传只要保证特殊的地址先到达Nginx,然后通过Nginx指定至指定的服务器即可,目前配置是本机.文件的下载的做法就是把本机的当前目录下面的文件给返回回去. server { listen ; ...

  3. SpringMVC实现文件的上传与下载

    文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考.这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出.最后会把 ...

  4. SpringMVC与JSON传值,取值,使用SpringMVC实现文件的上传与下载,SpringMVC拦截器

    一. JSON 1.1 什么是JSON 在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等: JSON(JavaScript Object Notation:JavaSc ...

  5. (十六)admin-boot项目之文件存储上传与下载minio

    (十六)文件存储上传与下载 项目地址:https://gitee.com/springzb/admin-boot 如果觉得不错,给个 star 简介: 这是一个基础的企业级基础后端脚手架项目,主要由s ...

  6. 如何搭建FTP服务器实现文件的上传及下载?(亲测有效)

      FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Protoc ...

  7. FTP服务(文件的上传和下载)

    文章目录 一.FTP的作用 二.FTP的端口号 三.FTP:匿名.系统.虚拟账户 四.FTP匿名账户的部署 1.关闭防火墙 2.安装vsftp服务 3.编辑配置文件 4.修改属主和属组,并创建文件 5 ...

  8. 模拟百度网盘中文件的上传与下载

    # 实现一个文件的上传或下载 server端 # 配置文件 ip地址 端口 import socket import struct import json sk = socket.socket() s ...

  9. Hadoop环境下用java代码实现hdfs远程文件的上传和下载

    Hadoop环境下用java代码实现hdfs远程文件的上传和下载 文章目录 Hadoop环境下用java代码实现hdfs远程文件的上传和下载 一.新建maven工程 二.文件的上传 三.文件的下载 四 ...

最新文章

  1. 炎热的夏天过去了,老司机用Python带你爬爬哪个城市最热
  2. require(os)
  3. lvs十种调度策略+三种模式
  4. UA OPTI544 量子光学9 2-level system approximation的向量模型
  5. php mysqli还原数据库,PHP mysqli操作数据库
  6. 2010年第一届蓝桥杯省赛 —— 第一题
  7. mysql服务器程序_MySQL服务器
  8. 学python要什么基础-要学Python编程,需要什么样的基础呢?想找这方面工作
  9. SpringBoot在前端发送url时,不能识别特殊字符的问题
  10. 企业年会活动常用的音频类、视频类工具软件
  11. Win10环境下VMware安装Mac OS虚拟机并在虚拟机中安装xcode
  12. paraview编译
  13. MATLAB 电子书
  14. 单片机芯片解密OTP存储器加密
  15. 《小窗幽记》卷六 集景
  16. TeamTalk服务器
  17. 如何使用CAD编辑器来画箭头
  18. c语言和Java你好世界,C编程语言之“你好世界”的例子
  19. Android实习周记:第一周,井底之蛙上岸
  20. 宇视摄像机码流类型定码率和变码率的区别?

热门文章

  1. Linux入门:基本操作
  2. 韩国计算机专业,韩国计算机专业发展前瞻
  3. 为什么要做计划管理?因为稳住Flag就能赢
  4. 4核处理器_麒麟990和麒麟990e哪个处理器好?选择哪款芯片更好?
  5. 原生js解决表格奇偶列显示
  6. 矿大赵银娣matlab,中国矿业大学考研研究生导师简介-蒋荣立
  7. 直通车在第一次做应该如何出价呢?如何出价更合理?
  8. C#中(.net1.1)公元历转农历的算法
  9. 《Linux命令行与shell脚本编程大全》笔记一
  10. PHP类实例教程(四):PHP5类中的方法