【问题标题】:How to upload a string to s3 as gzip Nodejs如何将字符串作为 gzip Nodejs 上传到 s3
【发布时间】:2019-06-13 16:11:10
【问题描述】:

我有一个从 Redis 读取字符串数组的 node.JS 程序。 我需要将此字符串以 GZIP 格式上传到 AWS s3 中的存储桶,而无需在上传之前在本地创建 gzip 文件。

基本上,我希望将读取的字符串从 Redis 流式传输到 s3 存储桶 gzip 压缩。

除了上述问题,我想知道以这种方式编程的有效和推荐方式是什么,因此将存储在 S3 中的文件最大为 64 MB,以防有额外数据,创建附加文件(也限制为最大 64MB)。 在下面的示例中,我展示了如何从 Redis 键中读取要存储在 s3 gzip 中的值限制为 64 MB:

client.lrange(key, 0, -1, (error, arrayStringValue) => {
            if (arrayStringValue == null || !arrayStringValue.length) {
                client.del(key);
                return console.log("removing key, no values");
            }
            if (error) reject(error);
            console.log("finish iterating");
            impressionsRecorded = true;
            //compress 
            uploadToS3(arrayStringValue, "bucket/key", null);

基本上我缺少的是 uploadToS3 方法的正确实现

【问题讨论】:

  • JavaScript SDK 中的AWS.S3.putObject() 不是“正确的实现”...?如果不是,不确定您在寻找什么。
  • 是否支持gzip格式上传?
  • 嗯,是的,也不是。 仍然需要进行 gzip 压缩,但由于 var params = { Body: <Binary String>, 上传(二进制)gzip 数据不是问题。您可能还想设置ContentEncoding: 'gzip',以便客户了解如何处理数据。 (这不会导致内容被压缩,它只是在获取对象时在响应标头中设置Content-Encoding: gzip,大多数客户端将使用它来自动/透明地解压缩有效负载。)
  • 如果你能用代码示例回答我将不胜感激,我会测试并确认答案:)

标签: node.js amazon-s3 upload gzip


【解决方案1】:

我必须解决同样的问题。这是我在 Node.js 中的解决方案。

const zlib = require('zlib');

const uncompressedString = 'Hi there';

const compressedStringAsBuffer = zlib.gzipSync(uncompressedString);

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

const s3Params = {
      Bucket: 'my-bucket',
      Body: compressedStringAsBuffer,
      Key: 'my-compressed-string.txt.gzip', // .gzip isn't required
      ContentType: 'text/plain', // change the ContentType if you want to serve HTML, CSS, JS, etc.
      ContentEncoding: 'gzip' // that's important
    };

await s3.putObject(s3Params).promise();

【讨论】:

    【解决方案2】:

    我正在扩展 Jan 为 IBM Cloud Object Storage (COS) 提供的答案:

    让我们处理 IBM COS 的凭据:

    var config = {
    endpoint: 's3.us-south.cloud-object-storage.appdomain.cloud',
    apiKeyId: 'put your key here',
    serviceInstanceId: 'put serviceInstanceID here',
    };
    
    //bucket settings
    var evaluation_bucket_name = 'evaluation.data'
    

    现在假设您有一个字符串,其中包含要压缩并提交给 IBM COS 的数据(您的数据可以是 JSON 格式或任何其他格式的用户数据)。这里我有一个名为 aggregated_records 的变量,它是 JSON 格式。

    toBeSubmitted = JSON.stringify(aggregated_records)
    const zlib = require('zlib');
    const toBeSubmittedCompressed = zlib.gzipSync(toBeSubmitted);
    var object_name = 'aggregated_records.json.gzip'
    

    现在,让我们将其提交给 IBM COS。

    CreateObject(evaluation_bucket_name, object_name, toBeSubmittedCompressed)
            .then(function () {
                console.log(`###The object has been successfully submitted to the IBM Object Storage!`)
            })
            .catch(function (err) {
                console.error('An error occurred:', util.inspect(err))
            });
    

    现在,我们来看看提交函数

    function CreateObject(bucket_name, object_name, object_content) {
        console.log('Creating object');
        return cos.putObject({
            Bucket: bucket_name,
            Key: object_name,
            Body: object_content,
            ContentEncoding: 'gzip'  //important for submitting compressed files
        }).promise();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 2020-09-03
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多