Express使用sendFile时如何为无扩展名文件设置自定义mimetype?
解决方案
完全可以手动指定响应的Content-Type头覆盖sendFile的默认行为,具体实现逻辑如下:
- 先根据请求参数从数据库中查询对应文件的原始mimetype值
- 在调用
sendFile之前,通过res.type()方法或者直接调用res.setHeader('Content-Type', 存储的mimetype)指定正确的MIME类型 - 再正常调用
sendFile返回文件即可,sendFile不会覆盖已经手动设置的Content-Type头
以下是可直接参考的代码示例:
const express = require('express') const path = require('path') const app = express() // 此处替换为你自己的数据库模型定义 const FileModel = require('./your-file-model') app.get('/uploads/:fileUuid', async (req, res, next) => { try { const fileUuid = req.params.fileUuid // 从数据库查询对应文件的记录,包含存储路径和原始mimetype const fileRecord = await FileModel.findOne({ uuid: fileUuid }) if (!fileRecord) return res.sendStatus(404) const filePath = path.join(__dirname, 'uploads', fileUuid) // 手动设置正确的mimetype res.type(fileRecord.originalMimetype) // 调用sendFile返回文件 res.sendFile(filePath, (err) => { if (err) next(err) }) } catch (err) { next(err) } })
注意:如果调用
sendFile时传入了options参数,不要在options的headers属性里重复设置Content-Type即可,只要你提前设置了响应头,sendFile会优先使用已有的值。
内容的提问来源于stack exchange,提问作者user2741831
相关产品推荐
相关产品推荐

