Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用nodejs/aws sdk将base64编码的pdf直接上载到s3?_Node.js_Amazon S3_Aws Sdk - Fatal编程技术网

Node.js 如何使用nodejs/aws sdk将base64编码的pdf直接上载到s3?

Node.js 如何使用nodejs/aws sdk将base64编码的pdf直接上载到s3?,node.js,amazon-s3,aws-sdk,Node.js,Amazon S3,Aws Sdk,我正在尝试使用以下代码将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',

我正在尝试使用以下代码将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,但得到了相同的结果,因此我假设可能缺少一个参数或一个标头。

创建一个新的缓冲区

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

现在在params中使用这个新缓冲区。这应该管用

我也遇到了同样的问题,并通过做出以下更改来解决:

const AWS = require('aws-sdk');
exports.putBase64 = async (object_name, buffer, bucket) => {
const

params = {
    Key: object_name,
    Body: Buffer.from(buffer, 'base64'), // <---------
    Bucket: bucket,
    ContentType: 'application/pdf'
};
const response = await S3.upload(params).promise();
return response;
};
const AWS=require('AWS-sdk');
exports.putBase64=异步(对象名称、缓冲区、存储桶)=>{
常数
参数={
键:对象名称,

Body:Buffer.from(Buffer'base64')Brad,我有一个POST请求,它有PDF数据和我需要的其他元数据。我用DOCuSUN作为参考,当他们通过他们的帖子上传到他们的服务器时,在Base64中编码他们的PDF。还有什么别的选择呢?Base64编码增加了33%的存储和带宽的开销。基本上是对CPU和内存的浪费。很少有真正好的使用案例。这个DocuSign API似乎设计得不太好。在你的情况下,我建议要么接受一个多部分POST,要么发出两个HTTP请求。我不完全清楚你在做什么,但听起来似乎是一个更好的方法将对PUT URL进行签名,在API响应中将其发送回客户端,并让其直接上传,而不是通过API服务器。此外,如果您必须在一个球中包含二进制资源,我建议使用类似CBOR的内容。它是标准化的,支持二进制,比JSON更多类型,是可扩展的,可流化,可在客户端和服务器端工作,并且没有太多开销。这看起来是更好的解决方案,它可以为您解决偏移问题。