express.js中如何将内存中的buffer数据转化为可下载文件?
场景1:Express直接返回Buffer供用户下载
不需要将Buffer写入本地磁盘,只需正确配置响应头后直接返回Buffer即可,示例代码如下:
// 路由中multer已经将文件解析到req.file const { buffer, originalname, mimetype } = req.file; // 配置响应头 res.set({ // 指定文件的MIME类型 'Content-Type': mimetype, // 指定为附件下载,encodeURIComponent解决中文文件名乱码问题 'Content-Disposition': `attachment; filename*=UTF-8''${encodeURIComponent(originalname)}`, // 指定文件大小 'Content-Length': buffer.length }); // 直接返回Buffer即可触发下载 res.send(buffer);
之后你把文件存入MongoDB时,只要同步存储buffer、originalname、mimetype三个字段,取出时复用上面的逻辑即可实现下载,不需要额外处理。
场景2:Buffer直接作为邮件附件发送
主流Node.js邮件发送库都原生支持直接传入Buffer作为附件内容,不需要写入本地文件,以常用的nodemailer为例,示例代码如下:
const nodemailer = require('nodemailer'); // 初始化邮件传输实例,配置你的邮箱服务商参数 const transporter = nodemailer.createTransport({ host: 'smtp.example.com', port: 465, secure: true, auth: { user: '你的邮箱地址', pass: '你的邮箱授权码' } }); // 发送带附件的邮件 async function sendAttachmentMail(fileBuffer, fileName, fileMimeType) { await transporter.sendMail({ from: '发件人 <sender@example.com>', to: '收件人 <receiver@example.com>', subject: '文件附件', text: '请查收附件中的文件', attachments: [ { filename: fileName, // 直接传入Buffer作为附件内容 content: fileBuffer, contentType: fileMimeType } ] }); } // 调用时直接传入req.file中的对应参数即可 // sendAttachmentMail(req.file.buffer, req.file.originalname, req.file.mimetype)
内容的提问来源于stack exchange,提问作者YTGS
相关产品推荐
相关产品推荐

