文章问题导向
nest如何文件上传?
如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案
注意
该文章只是单文件,小文件上传
下载文件的两种方式
第一种:后端压缩好文件,由前端下载
第二种:基于流的方式,向前端发送内容
本文是基于流的方式
第一步:安装
yarn add @nestjs/platform-express compressing
@nestjs/platform-express 平台依赖
compressing 文件下载依赖,提供流的方式
第二步:配置
src → config → file
配置文件的目录地址,以及文件的名字格式
import { join } from 'path';
import { diskStorage } from 'multer';
export default {
root: join(__dirname, '../uploads'),
storage: diskStorage({
destination: join(__dirname, `../uploads/${new Date().toLocaleDateString()}`),
filename: (req, file, cb) => {
const filename = `${new Date().getTime()}.${file.mimetype.split('/')[1]}`;
return cb(null, filename);
},
}),
};
第三步:编写代码
src -> module -> album
album.module.ts
import { Module } from '@nestjs/common';
import { MulterModule } from '@nestjs/platform-express';
import { ConfigService } from 'nestjs-config';
import { AlbumController } from './album.controller';
import { AlbumService } from './album.service';
@Module({
imports: [
MulterModule.registerAsync({
useFactory: (config: ConfigService) => config.get('file'),
inject: [ConfigService],
}),
],
controllers: [AlbumController],
providers: [AlbumService],
})
export class AlbumModule {}
album.controller.ts
import {
Controller,
Post,
UploadedFile,
UseInterceptors,
Get,
Res,
} from '@nestjs/common';
import { Response } from 'express';
import { FileInterceptor } from '@nestjs/platform-express';
import { AlbumService } from './album.service';
@Controller('album')
export class AlbumController {
constructor(private readonly albumService: AlbumService) {}
文件上传
@Post()
@UseInterceptors(FileInterceptor('file')) 获取header的file文件
upload(@UploadedFile() file) { 从UploadedFile可获取
this.albumService.upload(file);
return true;
}
文件下载
@Get('export')
async downloadAll(@Res() res: Response) {
基于流的下载方式
const { filename, tarStream } = await this.albumService.downloadAll();
设置响应to
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader(
'Content-Disposition',
`attachment; filename=${filename}`,
);
tarStream.pipe(res); 流转换到res响应
}
}
album.service.ts
compressing支持多种压缩方式
import { Injectable } from '@nestjs/common';
import { zip } from 'compressing';
import { ConfigService } from 'nestjs-config';
@Injectable()
export class AlbumService {
constructor(private readonly configService: ConfigService) {}
upload(file) {
console.log(file);
}
async downloadAll() {
const uploadDir = this.configService.get('file').root;
const tarStream = new zip.Stream(); 文件压缩流
await tarStream.addEntry(uploadDir); 压缩文件路径
return { filename: 'hello-world.zip', tarStream };
}
}
学习更多