Base64转Buffer上传Amazon S3后PDF无法打开,如何解决?
React Native PDF上传S3后无法打开的解决方案
问题核心原因
上传到S3的PDF无法打开,大概率是Base64字符串处理不规范导致文件损坏——比如前端传递的Base64带了data:application/pdf;base64,前缀,直接转Buffer会让文件头部混入无效字符,最终破坏文件结构。
修复方案
1. 清理Base64前缀(服务器端)
在转换Buffer前,先移除可能存在的Data URI前缀,确保只保留纯Base64内容:
public async storeFile({ request }: HttpContextContract) { const hash = crypto.randomBytes(32).toString('hex'); const key = `PDF-${hash}`; const rawFile = request.input('file'); // 移除Base64前缀(适配前端可能传递的格式) const base64Content = rawFile.replace(/^data:application\/pdf;base64,/, ''); const fileBuffer = Buffer.from(base64Content, 'base64'); await S3Service.uploadManually2(fileBuffer, key); }
2. 验证Buffer有效性
在上传S3前,先将Buffer写入本地文件,确认文件是否能正常打开,快速定位问题环节:
// 在storeFile中临时添加验证代码 import fs from 'fs'; fs.writeFileSync('./test-local.pdf', fileBuffer); // 若本地文件能打开,说明Buffer没问题,问题出在S3上传;反之则是Base64转换错误
3. 前端Base64生成校验
确保React Native端生成的是纯文件内容的Base64,无多余前缀。以expo-file-system为例:
import * as FileSystem from 'expo-file-system'; // 选择文件后读取内容 const fileUri = '选中的PDF文件URI'; const base64 = await FileSystem.readAsStringAsync(fileUri, { encoding: FileSystem.EncodingType.Base64, }); // 此时base64为纯文件内容,直接传给服务器即可
4. 优化S3上传参数(可选)
给文件key添加.pdf扩展名,避免S3识别文件类型出错;同时确保ContentType设置正确:
public async uploadManually2(file: Buffer, key: string): Promise<string> { const params = { Bucket: Env.get('AWS_BUCKET_NAME'), Body: file, Key: `${key}.pdf`, // 添加扩展名 ContentType: 'application/pdf', ACL: 'public-read', }; await s3.send(new PutObjectCommand(params)); const url = `https://${Env.get('AWS_BUCKET_NAME')}.s3.amazonaws.com/${key}.pdf`; return url; }
排查关键点
- 本地文件能打开但S3文件不能:检查S3的ContentType是否为
application/pdf,或是否存在CDN缓存问题 - 本地文件也不能打开:检查前端传递的Base64是否完整、是否存在编码截断
内容的提问来源于stack exchange,提问作者Oswaldo Barros
相关产品推荐
相关产品推荐

