【问题标题】:Why does uploading a .csv file to S3 get converted to a json为什么将 .csv 文件上传到 S3 会转换为 json
【发布时间】:2022-11-30 05:02:36
【问题描述】:

我正在尝试使用应用程序脚本将文件上传到 S3。

我一直在尝试使用https://github.com/viuinsight/google-apps-script-for-aws

S3.init();
S3.putObject("bucket123", 'Tacofile.txt', content, 'ca-central-1')
  1. 我从 Google Workspace 检索了一个文件,其中“Tacofile”是一个 .txt 文件
  2. 文件成功加载到S3

    但是,该文件以某种方式转换为 json?如何将文件保存为 csv,或者有没有办法在上传前的某处指定 MIME 类型?

    提前致谢

    碳纤维

【问题讨论】:

  • content 是文件还是 blob?如果不是一个 blob S3.putObject() 将它包装在一个 blob 中并 JSON.stringify()
  • 'content' 是一个文件...有没有办法防止 S3.putObject() 将它包装在一个 blob 中?

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


【解决方案1】:

是的,使用File.getBlob()S3.putObject("bucket123", 'Tacofile.txt', content.getBlob(), 'ca-central-1')

【讨论】:

  • 不起作用。问题是,即使您将内容作为 blob 传递,它也会到达此函数 execute(region, action, method, bucketName, objectName, payload, headers) 最终会出现在这里:else if (typeof payload !== "string ") { payload = JSON.stringify(payload);所以它不断将内容更改为 JSON
  • 对不起,那我就不知道了。
  • 谢谢,我将其用作参考,但收到了与 cmets 中相同的错误“AWS 错误 - BadDigest:您指​​定的 Content-MD5 与我们收到的不匹配。”另外,我认为这种方法行不通,因为无论你将内容转换成什么版本,它最终都会等同于有效载荷,它总是会被转换,这里..... if (typeof payload !== "string") { payload = JSON.stringify(payload); } var hashedPayload = Crypto.SHA256(payload);
【解决方案2】:

@theWizEd 感谢您为我指明正确的方向!我想我得到了这个工作。我更改了源数据,因此我的下载是使用以下方法完成的:

object = DriveApp.getFileById(file_id).getBlob().getDataAsString();

我更改了下面第 106 行的部分:

  if (notBlob) {
    object = Utilities.newBlob(JSON.stringify(object), "application/json");
    object.setName(objectName);
  }
var content = object.getDataAsString();  
var contentType = object.getContentType();
var contentMD5 = getContentMD5(content);

到以下

  if (notBlob) {
    //object = Utilities.newBlob(JSON.stringify(object), "application/json");
    //object.setName(objectName);
  }

  var content = object; 
  var contentType = MimeType.PLAIN_TEXT
  var contentMD5 = getContentMD5(content);

【讨论】: