下载文件的方式有好多种
1.download 直接下载
这个文件信息应该存数据库 ,这里演示就写死了
import { Controller, Get, Post, Body, Patch, Param, Delete, UploadedFile, UseInterceptors, Res } 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';
import { join } from 'path';
import { Response } from 'express';
@Controller('upload')
export class UploadController {
constructor(private readonly uploadService: UploadService) { }
@Post('album')
@UseInterceptors(FileInterceptor('file'))
create(@UploadedFile() file) {
console.log(file);
return true;
}
@Get('export')
downLoad(@Res() res: Response) {
const url = join(__dirname, '../images/1708440096666.jpg');
res.download(url)
}
}
浏览器访问接口http://localhost:3000/upload/export,可以看到图片已经被下载到本地了
2.使用文件流的方式下载
可以使用compressing把他压缩成一个zip包
import {zip} from 'compressing'
@Get('stream')
async down (@Res() res:Response) {
const url = join(__dirname,'../images/1662894316133.png')
const tarStream = new zip.Stream()
await tarStream.addEntry(url)
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader(
'Content-Disposition',
`attachment; filename=xiaoman`,
);
tarStream.pipe(res)
}
前端接受流
const useFetch = async (url: string) => {
const res = await fetch(url).then(res => res.arrayBuffer())
console.log(res)
const a = document.createElement('a')
a.href = URL.createObjectURL(new Blob([res],{
// type:"image/png"
}))
a.download = 'zl.zip'
a.click()
}
const download = () => {
useFetch('http://localhost:3000/upload/stream')
}