我试图返回使用我的巢控制器GridFS的文件。至于我可以告诉巢不尊重我的自定义content-type
头,我设置为application/zip
,因为我收到返回后文本内容类型(见截图)。
response data image, wrong content-type header
我窝控制器看起来像这样
@Get(':owner/:name/v/:version/download')
@Header('Content-Type', 'application/zip')
async downloadByVersion(@Param('owner') owner: string, @Param('name') name: string, @Param('version') version: string, @Res() res): Promise<any> {
let bundleData = await this.service.getSwimbundleByVersion(owner, name, version);
let downloadFile = await this.service.downloadSwimbundle(bundleData['meta']['fileData']['_id']);
return res.pipe(downloadFile);
}
这里是服务呼叫
downloadSwimbundle(fileId: string): Promise<GridFSBucketReadStream> {
return this.repository.getFile(fileId)
}
这实质上是一个直通此。
async getFile(fileId: string): Promise<GridFSBucketReadStream> {
const db = await this.dbSource.db;
const bucket = new GridFSBucket(db, { bucketName: this.collectionName });
const downloadStream = bucket.openDownloadStream(new ObjectID(fileId));
return new Promise<GridFSBucketReadStream>(resolve => {
resolve(downloadStream)
});
}
我的最终目标是调用download
端点,有一个浏览器中注册,这是一个zip文件和下载它,而不是看到在浏览器中的二进制。上需要做到那里什么任何指导,将不胜感激。谢谢阅读
您还需要设置Content-Disposition
头与文件名。您可以使用@Header()
装饰如果文件名称将永远是相同的,或者如果你需要能够根据需要在控制器的一些参数发送回不同的文件名直接响应对象上setHeader
。
下面的两个例子控制方法的工作从我的本地文件系统发送回一个下载文件到浏览器。
@Get('/test')
@Header('Content-Type', 'application/pdf')
@Header('Content-Disposition', 'attachment; filename=something.pdf')
getTest(@Res() response: Response) {
const data = createReadStream(path.join(__dirname, 'test.pdf'));
data.pipe(response);
}
@Get('/test')
@Header('Content-Type', 'application/pdf')
getTest(@Res() response: Response) {
const data = createReadStream(path.join(__dirname, 'test.pdf'));
response.setHeader(
'Content-Disposition',
'attachment; filename=another.pdf',
);
data.pipe(response);
}