【问题标题】:AWS S3: .csv file is downloaded as .csvAWS S3:.csv 文件下载为 .csv
【发布时间】:2018-08-02 14:46:59
【问题描述】:

我有 2 个 AWC 帐户,每个帐户都有一个 S3 存储桶。我将两个相同大小的 .CSV 文件上传到每个 S3 存储桶。

当我尝试下载下载为时,该文件在第一个帐户中下载为 .CSV 文件。但是(!!)当我尝试从第二个帐户下载此文件时 - 它正在将其下载为 .TXT。

怎么会这样?这两个文件的创建方式相同:通过 Redshift UNLOAD 查询,将所选数据从 Redshift 复制到 S3。

更新会不会是因为在这个文档的这个账号里,**服务器端加密等于AWS-KMS? 我注意到从 .csv 转换为 .txt 的文件具有“服务器端加密:AWS-KMS”,而下载为 .csv 的 .csv 文件具有“服务器端加密:无”

更新:在不同的浏览器中尝试 - 结果相同

【问题讨论】:

  • 无论 SSE-KMS 或内容类型元数据如何(尽管我没有使用 Redshift),都可以在 Chrome 中正常工作。
  • @jarmod 你好。我尝试了 Firefox 和 Chrome - 结果相同。我注意到从 .csv 转换为 .txt 的文件具有“服务器端加密:AWS-KMS”,而作为 .csv 下载的 .csv 文件具有“服务器端加密:无”
  • 对,但我是说在这里可以正常工作(SSE-KMS 是使用 KMS 的服务器端加密)。

标签: amazon-web-services amazon-s3 amazon-redshift


【解决方案1】:

在 AWS S3 控制台中检查每个对象的标头并比较 Content-Type 值。 Content-Type 向 Web 浏览器提供有关对象包含哪些数据的提示。

如果 Content-Type 不存在或不包含 text/csv,请在 S3 控制台中或通过您喜欢的 S3 应用程序(例如 CloudBerry)添加或修改标头。

【讨论】:

  • 是的,你是对的。正确下载的文件中有 Content-type: txt/csv 并且在 .TXT 中转换的文件中没有 Content-type 值。问题是,我不能手动完成。我不能去修改每个文件。我有很多,每天都会添加新文件。我通过 Redshift UNLOAD 命令创建了这个文件。所以不知道如何处理这个
  • 我不知道让 Redshift 指定 Content-Type 标头的方法。执行 UNLOAD 命令时是否已经存在有问题的文件?如果是这样,标题将不会更改。在 UNLOAD 之前先删除它们。另一个想法是使用 Lambda 处理新文件,如果它们具有 .csv 文件后缀,则添加 HTTP Content-Type 标头。
  • 不,UNLOAD 执行时这些文件不存在。 UNLOAD 在我指定的 S3 存储桶中创建新文件
【解决方案2】:

关于Content-Type 不是text/csv,John 是对的。有时,S3 会做对,有时却不会。如果您自己无法手动更正此问题,您可以在每次上传新对象时运行 Lambda 函数为您执行此操作。您可以使用 Python 2.7 模板 Lambda 函数从存储桶下载对象,为您的 S3 对象使用 mimetypes 库到 guess_type,然后在同一存储桶中重新上传文件。您需要通过 S3 对象上传来触发此功能并为其提供必要的权限 (S3:GetObject)。

P.S. 这适用于任何扩展名的文件。如果你知道你只是要上传.csv文件,你可以忽略mimetypes,直接用

重新上传对象
bucket.upload_fileobj(filename, key, ExtraArgs={'ContentType': 'text/csv'})

如果 mimetypes 无法猜测类型,那么您可能需要添加类型,请查看此处的示例 https://www.programcreek.com/python/example/5209/mimetypes.add_type

祝你好运!

【讨论】:

    【解决方案3】:

    这里是scala 解决方案(指定内容类型):

    val settingsLine: String = "csvdata1,csvdata2,csvdata3"
    val settingsStream: InputStream = new ByteArrayInputStream(settingsLine.getBytes())
    
    val metadata: ObjectMetadata = new ObjectMetadata()
    metadata.setContentType("text/csv")
    
    s3Client.putObject(bucketName, prefix, settingsStream, metadata)
    

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2020-04-07
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多