未存储在 Azure(或任何其他服务)中的 ActionText 图像

ActionText image not stored in Azure (or any other service)

我有一个带有 ActionText 和 ActiveStorage 的 Rails 应用程序。所以我有一个带有描述字段的票证表单,其中使用了 ActionText。当我将开发环境配置为将附件保存到本地磁盘时,一切正常。

但是当我将其配置为使用 Azure 存储时,我在日志中看到它似乎已上传(它 returns 和 URL),但是当我查看 Azure 时,有没有存储图像。这是日志:

Started POST "/rails/active_storage/direct_uploads" for ::1 at 2019-07-30 08:05:37 +0200
Processing by ActiveStorage::DirectUploadsController#create as JSON
  Parameters: {"blob"=>{"filename"=>"schaap.jpg", "content_type"=>"image/jpeg", "byte_size"=>56679, "checksum"=>"xNr4chw64aFTDzzvpmupBg=="}, "direct_upload"=>{"blob"=>{"filename"=>"schaap.jpg", "content_type"=>"image/jpeg", "byte_size"=>56679, "checksum"=>"xNr4chw64aFTDzzvpmupBg=="}}}
   (0.2ms)  BEGIN
  ActiveStorage::Blob Create (0.8ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "byte_size", "checksum", "created_at") VALUES (, , , , , ) RETURNING "id"  [["key", "p83x87l66oibofrfmitfiqet120d"], ["filename", "schaap.jpg"], ["content_type", "image/jpeg"], ["byte_size", 56679], ["checksum", "xNr4chw64aFTDzzvpmupBg=="], ["created_at", "2019-07-30 06:05:38.851532"]]
   (0.6ms)  COMMIT
  AzureStorage Storage (0.9ms) Generated URL for file at key: p83x87l66oibofrfmitfiqet120d (https://<blob name>.blob.core.windows.net/<container-name>/p83x87l66oibofrfmitfiqet120d?sp=rw&sv=2016-05-31&se=2019-07-30T06%3A10%3A38Z&sr=b&sig=%2BicDHTsLBXWCIr00m4cbmcg3U6il5LMfhVcKwTq8dns%3D)
Completed 200 OK in 867ms (Views: 0.4ms | ActiveRecord: 5.7ms | Allocations: 70289)

这是在config/development.rb:

config.active_storage.service = :local

这是在 storage.yml:

local:
  service: AzureStorage
  storage_account_name: "<account-name>"
  storage_access_key: "<access-key>"
  container: "<container>"

并使用正确的 gem:

gem 'azure-storage', require: false

所以怎么了?我对 Digital Ocean 空间进行了同样的尝试,但结果完全相同,所以它与 Azure 无关。

就个人而言,我从未使用过 AzureStorage,但我使用过 DigitalOcean Spaces。为了通过 ActiveStorage 启用直接上传,您需要确保设置的一件事是 CORS。我可能是错的,但我认为这可能是你的问题所在。

我用谷歌搜索 "AzureStorage CORS" 并在他们的 CORS 设置中找到 MicroSoft's documentation

使用 Digital Ocean 时,您需要使用 their documentation to setup s3cmd 并使用它来设置 CORS 以进行直接上传。

设置完成后,您将在您的项目中创建一个 CORS 文件 (cors.xml):

<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>http://localhost:3000</AllowedOrigin>
    <AllowedOrigin>https://yourdomain.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

然后,您将使用 s3cmd 工具通过 运行 在您的项目目录中设置以下内容:

s3cmd setcors cors.xml s3://yourbucketname

GoRails great video 关于如何执行此操作。

Digital Ocean 也有一个 CORS user interface,但通常不能满足我的需求。