簡體   English   中英

Active Storage public_url 不返回 key/filename.extension

[英]Active Storage public_url not returning key/filename.extension

此 PR 中將公共選項添加到 Active Storage: https : //github.com/rails/rails/pull/36729
在里面他清楚地說: “在公共存儲桶中,目錄結構是/[key]/[filename]”

這是有道理的,正是我想要的。 我希望能夠(例如)將鏈接通過電子郵件發送給某人並允許他們下載文件。 所以我需要文件名.extension。 但是當我啟動 Rails 6.1 應用程序時,上傳到我的存儲桶的文件名后面沒有。 這些文件確實出現在我的存儲桶中,但僅作為它們的密鑰。 不是密鑰/文件名。

amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: us-east-1
  bucket: mybucket
  public: true

上傳工作正常。 文件已上傳並出現在我的存儲桶中。 但在視圖<%= @user.avatar.url %>返回https://s3.amazonaws.com/mybucket/g3ci2umbfj6wkxyggx7arhekxfib希望它返回https://s3.amazonaws.com/mybucket/g3ci2umbfj6wkxyggx7arhekxfib/myfile.png這真的讓我很煩,因為在 PR 中作者明確指出公共文件保存為 key/filename.extension

所以問題是:在 Rails 6.1 中, url方法是否將文件名作為路徑的一部分返回。 如果不是,作者為什么說它是? 如果沒有,還有比修補key更好的方法嗎?

域名注冊地址:

= link_to @user.avatar.filename, rails_blob_path(@user.avatar, disposition: "course.avatar"), target: :_blank

會給你一個下載鏈接,比如https://corsego-production.s3.eu-central-1.amazonaws.com/3gbpl68kckpkyrbjoslsl254th0u?response-content-disposition=inline&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEGgaCmV1LBuuKkri8zL3ohM4h9STzhTsnavAgulrcpBavL0POXg%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20201002T170820Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Credential=ASIA5RINJ20201002%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Signature=0a205d713ebaa9d3ca9d62


@user.avatar.url不應該返回任何東西!

@user.avatar應該返回類似#<ActiveStorage::Attached::One:0x00007f15986ee4c0>

使用 Active Storage 創建附件時,有關附件的以下字段會自動填充並保存為active_storage_blobs

  create_table "active_storage_blobs", force: :cascade do |t|
    t.string "key", null: false
    t.string "filename", null: false
    t.string "content_type"
    t.text "metadata"
    t.bigint "byte_size", null: false
    t.string "checksum", null: false
    t.datetime "created_at", null: false
    t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
  end

假設您上傳了具有活動存儲空間的圖像。 上表將按以下方式填充:

Id: 1
Key: sy2y1ytw7zob6mwtnwc1552cdp5l
Filename: Screenshot 2020-10-02 125405.png
Content_type: image/png
Metadata: {"identified"=>true, "analyzed"=>true}
Byte_size: 1550
Checksum: mGPerbRMj6LXbPKhqKd4bA

要將用戶頭像顯示為圖像,您必須調用= image_tag @user.avatar

= rails_blob_url(@user.avatar)會給你像https://example.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--5fb10a9c8e9f2c4e7099eee21c1dc2ff0343c210/Screenshot%202020-10-02%20125405.png

= @user.avatar會給你類似#<ActiveStorage::Attached::One:0x00007f1589293dd0>

= url_for(@user.avatar)會給你像/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--5fb10a9c8e9f2c4e7099eee21c1dc2ff0343c210/Screenshot%202020-10-02%20125405.png

active_storage 創建的遷移中的第二個表是這樣的:

  create_table "active_storage_attachments", force: :cascade do |t|
    t.string "name", null: false
    t.string "record_type", null: false
    t.bigint "record_id", null: false
    t.bigint "blob_id", null: false
    t.datetime "created_at", null: false
    t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
    t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
  end

基本上,它將 blob 與應用程序中的特定記錄連接(基本上, avatarblob@userrecord ,它們通過active_storage_attachments表關聯。

所以你也可以在@user.avatar 方法上運行以下命令:

@user.avatar.name #Avatar
@user.avatar.record_type #User
@user.avatar.record_id #2 (user id)
@user.avatar.blob_id #1 (blob id)

在此處輸入圖片說明

現在,以下是存儲在 AWS S3 上的上述文件的示例 URL: https : //corsego-production.s3.eu-central-1.amazonaws.com/3gbpl68kckpkyrbjoslsl254th0u? response-content-disposition = inline & X-Amz- Security-標記= IQoJb3JpZ2luX2VjEGgaCmRzBFAiBSJ2QIEqs1opj%2BuCR74CDMt67ueDTTQIhAOJGGy2wfmxmGUwpQe9cyc84ZhUhuWKHdVgTUctbtGrVKdinkpg0w7OikcyNYpnbq%2FefcTmEgRvIlPO%2B0itFxUr8mKUvnDYSuKkri8zL3ohM4h9STzhTsnavAgulrcpBavL0POXg%3D%3D&X-AMZ-算法= AWS4-HMAC-SHA256&X-AMZ-日期= 20201002T170820Z&X-AMZ-SignedHeaders =宿主&X-AMZ-過期= 300&X-AMZ-憑證= ASIA5RINJLY2F20201002%2Feu- central-2%2Fs3%2Faws4_request&X-Amz-Signature=0a205d713ebaaa339ad4ee09db9dfe16986e69d3ca9d62

查看 url 如何包含秘密令牌和到期時間? 建議不要有永久的文件 url。

PS 將 AWS S3 連接到您的應用程序時,不要忘記添加CORS 配置 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM