【问题标题】:Active Storage Uploads to S3 with encryption. How to remove encryption and save file as is in storage主动存储通过加密上传到 S3。如何删除加密并将文件按原样保存在存储中
【发布时间】:2020-05-16 15:27:10
【问题描述】:

当我将带有 API 多部分的文件上传到 Rails 服务器时。 Rails 服务器将文件上传到 s3。但是当我去 s3 时,文件被加密了,这是我不想要的。

当我从 jbuilder 中获取 URL 时

json.url Rails.application.routes.url_helpers.rails_blob_url(document.doc) 

我得到的 URL 是 rails 路径,它使用一个键重定向到 S3 图像以显示图像。

如果我可以将S3链接直接放在文件URL中会更好。

【问题讨论】:

    标签: ruby-on-rails amazon-s3 rails-activestorage


    【解决方案1】:

    Active Storage 不使用提供的文件名存储文件,而是使用 Rails 的 has_secure_token 键。 因此,即使您尝试查看存储在本地的文件(如果您使用默认的local 服务),它也会使用一些随机的alpha-numeric 字符串保存。

    如果您想使用AWS Server Side Encryption 明确上传,您可能需要更新服务配置,例如 -

    amazon:
      service: S3
      bucket: somebucketname
      upload:
        server_side_encryption: AES-256
    

    如果它通过 implementing 自定义 ActiveStorage::Service 工作,您可以找到一种可能性。如果有人这样做,请分享! :D

    或者直接使用Carrierwave!!

    参考-

    1. ActiveStorage::Blob
    2. ActiveStorage::Service

    【讨论】:

      【解决方案2】:

      如果您使用 Rails 主动存储并且不想默认加密文件,则需要将 storage.yml 更改为类似的内容。

      amazon:
        service: S3
        bucket: somebucketname
        upload:
          server_side_encryption: nil
      

      或者如果你使用aws-sdk-s3 gem,这里是aws-sdk-s3官方指南的链接

      您还可以从 AWS 更改现有文件加密。 Here is the documentation.

      对于 URL 部分,您可以调用 object.images[0].service_url 这将返回类似 https://yourbucketname.s3.eu-central-1.amazonaws.com/yr2r6bo1ai1g9yavg7p9480ptdy4?response-content-disposition=inline%3B%20filename%3D%22images-museum_5_3.png%22%3B%20filename%2A%3DUTF-8%27%27images-museum_5_3.png&response-content-type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJJWMS7WXXZREOOCQ%2F20200413%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20200413T123825Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=14bf4d26d9b3f3c98c29d84c647fc6fa88d903e157a0d41e0ad209937ffaf92b 的内容

      您可以将第一部分存储为对象 URL。它不会改变 URL 的一部分。

      那部分是https://yourbucketname.s3.eu-central-1.amazonaws.com/yr2r6bo1ai1g9yavg7p9480ptdy4

      【讨论】:

      • 您上面的代码给出了错误``` #<:s3::errors::invalidargument: server side encryption with kms managed key requires http header x-amz-server-side-encryption : aws :kms>" ``` 本地文件服务也不能像回形针那样没有加密吗?
      最近更新 更多