将流数据上传到 Amazon S3
Posted
技术标签:
【中文标题】将流数据上传到 Amazon S3【英文标题】:Uploading stream data to Amazon S3 【发布时间】:2018-09-07 23:39:49 【问题描述】:我正在尝试将 svg QR 码推送到我的节点应用程序上的 S3。
据我了解,我应该将缓冲区上传到 S3。当我检查 qrResult 时,我在任何地方都看不到。也许我从根本上误解了 writeStreams 的概念,以及如何将数据通过管道传输到 S3 上传,但我似乎无法弄清楚这一点......
let fileName = 'qrCode'
let qrCode = Qr.image('The ultimate test', type: 'svg' );
let output = fs.createWriteStream(fileName)
let qrResult = qrCode.pipe(output)
let s3bucket = new Aws.S3(
accessKeyId: env.AWS_ACCESS_KEY
secretAccessKey: env.AWS_SECRET,
Bucket: env.S3_BUCKET_NAME,
);
let params =
Bucket: env.S3_BUCKET_NAME,
Key: fileName,
Body: qrResult,
;
s3bucket.upload(params, function (err, qrResult)
if (err)
console.log('error in callback');
console.log(err);
console.log('success');
console.log(qrResult);
);
【问题讨论】:
试试***.com/questions/48363593/… 【参考方案1】:您可能需要在参数中添加 ContentType 和 ACL:
let params =
Bucket: env.S3_BUCKET_NAME,
Key: fileName,
Body: qrResult,
ContentType: 'image/svg+xml',
ACL: 'public-read'
;
顺便说一句,我在您的代码中看不到 file
对象。
也可以使用putObject
而不是upload
,例如:
s3bucket.putObject(params...
【讨论】:
@Modermo:文件指的是什么?用那个文件指的是什么来更新问题? 恐怕它仍然不适合我。s3bucket.upload
似乎甚至没有触发,因为没有从回调中调用 console.log
。
@Modermo 你可以试试 s3bucket.putObject 而不是上传
好的,看起来putObject
正在返回Cannot pipe, not readable
。
你弄错了吗?即控制台中有消息error in callback
?【参考方案2】:
key rappresent qrCode 的名称,data 是 qrCode 本身。
所以你可以定义一个创建参数的函数,像这样:
aws.config.update(
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
);
const s3 = new aws.S3(
params:
Bucket: process.env.S3_BUCKET
const data = createParams(name,data);
s3.putObject(data, (err, response) => ....);
createParams(qrName, qrCode)
let data =
Key: file.name,
Body: file.data,
ContentType: 'image/svg+xml',
ACL: 'public-read'
return data
数据是您的写入流或您的 qrCode 的输出
【讨论】:
以上是关于将流数据上传到 Amazon S3的主要内容,如果未能解决你的问题,请参考以下文章
从 Apache Spark 分段上传到 Amazon S3
如何将抓取的数据从 Scrapy 以 csv 或 json 格式上传到 Amazon S3?
Amazon S3 .NET:上传 base64 图像数据?
使用 Laravel 5.0 存储门面将元数据、标头(Expires、CacheControl)添加到上传到 Amazon S3 的文件中