【问题标题】:How to upload base64 encoded pdf directly to s3 with nodejs/aws-sdk?如何使用 nodejs/aws-sdk 将 base64 编码的 pdf 直接上传到 s3?
【发布时间】:2020-07-05 22:09:41
【问题描述】:

我正在尝试使用以下代码将 base64 编码的 pdf 上传到 S3,而无需将文件写入文件系统。

const AWS = require('aws-sdk');
exports.putBase64 = async (object_name, buffer, bucket) => {
const params = {
    Key: object_name,
    Body: buffer,
    Bucket: bucket,
    ContentEncoding: 'base64',
    ContentType: 'application/pdf'
};
const response = await S3.upload(params).promise();
return response;
};

其中 buffer 是编码为 base64 的空白 pdf。尝试在 s3 上打开文件时,我得到“我们无法打开此文件 出了点问题。” 在尝试打开它时。

但是,如果我将 base64 编码写入文件然后上传,它就可以工作。

await fs.writeFileSync(`./somepdf.pdf`, base_64, 'base64');
exports.put = async (object_name, file_location, bucket, content_type) => {
const file_content = fs.readFileSync(file_location);
const params = {
    Key: object_name,
    Body: './somepdf.pdf',
    Bucket: bucket,
    ContentType: 'application/pdf'
};
const response = await S3.upload(params).promise();
return response;
};

我注意到直接上传文件时,通过文本编辑器查看文件时的文件编码不是 base64 编码,但查看上传的文件为严格定义的 contentencoding base64 显示 base64。我尝试使用 atob 将 base64 转换为 blob,但产生了相同的结果,因此我假设可能缺少一个参数或标题。

【问题讨论】:

  • 你为什么要对它进行base64编码!?
  • @Brad 我有一个 POST 请求,其中包含我需要的 pdf 数据和其他元数据。我使用 docusign 作为参考,因为他们在通过 POST 上传到服务器时使用 base64 对 PDF 进行编码。 developers.docusign.com/esign-rest-api/guides/concepts/…我应该考虑什么其他选择?
  • Base64 编码为存储和带宽需求增加了 33% 的开销,并且基本上浪费了 CPU 和内存。很少有真正好的用例。这个 DocuSign API 似乎设计得不是很好。在你的情况下,我建议要么接受一个多部分的 POST,要么发出两个 HTTP 请求。我并不完全清楚你在做什么,但听起来更好的方法是签署 PUT URL,在你的 API 响应中将其发送回客户端,然后让它直接上传而不是通过您的 API 服务器。
  • 另外,如果您绝对必须将二进制资源包含在一个球中,我建议您使用 CBOR 之类的东西。它是标准化的,支持二进制,比 JSON 更多的类型,可扩展,可流式传输,在客户端和服务器端都可以工作,并且没有太多开销。

标签: node.js amazon-s3 aws-sdk


【解决方案1】:

我遇到了同样的问题,并通过进行此更改来解决它:

const AWS = require('aws-sdk');
const S3 = new AWS.S3();

exports.putBase64 = async (object_name, buffer, bucket) => {

    const params = {
        Key: object_name,
        Body: Buffer.from(buffer, 'base64'), // <---------
        Bucket: bucket,
        ContentType: 'application/pdf'
    };

    return await S3.upload(params).promise();
};

【讨论】:

  • 这看起来是更好的解决方案,它会为您处理偏移量。
  • 在尝试了建议使用 s3.putObject 而不是 s3.upload 的解决方案之后,这是唯一适合我的答案
【解决方案2】:

创建一个新的缓冲区

const newBuffer = buffer.replace(/^data:.+;base64,/, "")

现在在 params 中使用这个新缓冲区。这应该可行!

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2019-12-06
    • 2020-09-03
    • 2013-11-14
    • 2016-01-30
    • 2016-01-09
    • 2021-04-02
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多