从AWS S3获取PDF后下载得到0字节文件问题求助
问题分析与解决方案
1. S3 Bucket参数配置错误
你的S3 getObject 参数中,Bucket 字段错误地包含了路径前缀 /receipts。S3的Bucket仅代表存储桶名称,对象的路径前缀属于Key的一部分,而非Bucket名称的组成部分。这会导致你实际请求的是一个不存在的桶(名称带斜杠),即便你认为buffer不为空,也可能返回的是错误对象或无效内容。
修正后的参数:
const params = { "Bucket": process.env.AWS_BUCKET_NAME, // 仅填写存储桶名称 "Key": `receipts/${transactionId}.pdf` // 前缀+文件名作为完整Key };
2. 响应流处理的潜在问题
你的renderBuffer方法通过PassThrough流中转buffer再pipe到响应,在Express类框架中,直接发送buffer会更可靠,避免流异步处理导致响应提前结束:
简化后的renderBuffer实现:
public async renderBuffer(_res: Response<unknown, Record<string, unknown>>, buffer: Buffer): Promise<void> { _res.setHeader('Content-type', 'application/pdf'); _res.setHeader('Content-disposition', `attachment; filename=report.pdf`); _res.send(buffer); // 直接发送buffer,无需流中转 }
如果坚持使用流,需确保流结束事件被正确处理,防止响应提前关闭:
public async renderBuffer(_res: Response<unknown, Record<string, unknown>>, buffer: Buffer): Promise<void> { const readStream = new stream.PassThrough(); readStream.end(buffer); _res.setHeader('Content-type', 'application/pdf'); _res.setHeader('Content-disposition', `attachment; filename=report.pdf`); readStream.pipe(_res); // 监听流结束,确保响应完整发送 readStream.on('end', () => _res.end()); }
验证步骤
- 优先修正Bucket和Key的参数配置,这是导致0字节文件的核心原因;
- 测试简化后的响应发送方式,排除流处理的问题;
- 确认S3控制台中对象的完整Key与代码生成的路径完全一致。
内容的提问来源于stack exchange,提问作者Fernanda
相关产品推荐
相关产品推荐

