如何将png文件上传到S3存储桶?

时间:2020-04-28 23:41:04

标签: amazon-s3 google-apps-script urlfetch

尝试使用S3-for-Google-Apps-Script库将png文件上传到S3存储桶:

// get the image blob
const imgBlob = UrlFetchApp.fetch('imageUrl').getBlob();

// init S3 instance
const s3 = S3.getInstance(awsAccessKeyId, awsSecretKey);

// upload the image to S3 bucket
s3.putObject(bucketName, 'test.png', imgBlob, { logRequests:true });

文件正在上传到S3,但不是完美的方式!看起来像这样:

file image

如果我下载图像并打开获取error

“它可能已损坏或使用了预览无法识别的文件格式。”

那么,如何将.png文件上传到Amazon S3存储桶?


当'base64'用于s3.putObject()时,我可以正确上传图像:

const base64 = Utilities.base64Encode(imgBlob.getBytes());
s3.putObject(bucketName, 'test.png', base64, { logRequests:true });
// go to S3 and clicking on the link I can see the base64 string

但这是作为String上传的,例如当我进入S3并单击test.png时,会看到类似的内容:"iVBORw0KGgoAAAANSUhEUgAAAgAAAAI ... II=",但是我想查看的是实际图像,而不是String

1 个答案:

答案 0 :(得分:3)

我相信您的情况和目标如下。

  • 根据您的情况,可以上传图像的base64数据。但是,上传的数据不是图像。这是字符串数据。
  • 在您的目标中,您想要使用图像URL上传公共共享图像的图像文件。

为此,这个答案如何?

问题和解决方法:

当我看到“ S3-for-Google-Apps-Script”的脚本时,似乎该URL无法直接用于s3.putObject()。并且,使用getDataAsString()将输入的Blob转换为字符串类型。我认为这是您遇到问题的原因。

在这个答案中,我想建议修改GAS库“ S3-for-Google-Apps-Script”,以将字节数组用于payload

用法:

首先,请复制S3-for-Google-Apps-Script的GAS项目,并进行如下修改。

修改后的脚本:

关于S3.prototype.putObject文件中的S3.gs,请进行如下修改。

从:
request.setContent(object.getDataAsString());
至:
request.setContent(object.getBytes());

并且,关于S3Request.prototype.setContent文件中的S3Request.gs,请进行以下修改。

从:
if (typeof content != 'string') throw 'content must be passed as a string'
至:
// if (typeof content != 'string') throw 'content must be passed as a string'

并且,关于S3Request.prototype.getContentMd5_文件中的S3Request.gs,请进行以下修改。

从:
return Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this.content, Utilities.Charset.UTF_8));
至:
return Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this.content));

示例脚本:

对于上述修改后的脚本,请测试以下脚本。

const imageUrl = "###";  // Please set the image URL.
const s3 = S3.getInstance(awsAccessKeyId, awsSecretKey);  // Please set them.

const imageBlob = UrlFetchApp.fetch(imageUrl).getBlob();
s3.putObject(bucketName, 'test.png', imageBlob, { logRequests:true });
  • 这样,您的令牌可以由修改后的库创建并使用。
  • 当我选中this official document时,我认为可以使用字节数组。

参考文献: