You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:27:33