【问题标题】:Where does active storage store files (on disk), and how can I retrieve them physically?活动存储在哪里存储文件(在磁盘上),我如何物理检索它们?
【发布时间】:2019-07-03 03:14:23
【问题描述】:

我在 Rails 5.2 中使用主动存储。我遵循 EdgeRails 指南,并已将 Active-Storage 配置为使用本地磁盘。

当我使用 Rails 应用程序时,文件上传效果很好。

但是,问题是我需要在不使用 Rails 作为中介的情况下物理访问那些上传的文件。

对文件存储位置的查询返回:

url_for(@employee_staff.avatar)
=> "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBGUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--e76664d247cb5437fe1cd11f7ee0ded24f95aee2/profilepic3.jpeg"

我正在尝试找出此文件路径在我的本地磁盘中的保存位置。到目前为止,我没有运气。

非常感谢任何关于 Active-Storage 如何工作以及我可以在哪里看到上传文件的解释。

【问题讨论】:

  • 你见过guide吗?
  • 是的,我仍然对活动存储将文件保存在哪个目录感到困惑。我目前正在使用指南中指定的“磁盘服务”选项,所以我希望它会在某个地方在我的文件系统中。
  • 是的,如果您的 storage.yml 看起来像指南中的那样,那么文件就在您的项目文件夹中。
  • 我一直在尝试在我的项目中找到 /rails/active_storage/(使用 vscode 查找文件夹功能),但仍然看不到该特定目录的任何列表。我也尝试过实际搜索它,但没有运气。
  • 这能回答你的问题吗? Get path to ActiveStorage file on disk

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


【解决方案1】:
ActiveStorage::Blob.service.path_for(@employee_staff.avatar.key)

正如在Answer中看到的那样

【讨论】:

    【解决方案2】:

    如果您有变体:

    variant = @employee_staff
                .avatar
                .attachment
                .variant(resize: '100x100')
                .processed # If variant is not processed
    
    variant.service.send(:path_for, variant.key) # Absolute path to variant file
    

    【讨论】:

      【解决方案3】:

      在你的本地开发机器上(因为你提到了本地磁盘),你应该有一个文件config/storage.yml,它有一个类似于下面的块:

      local:
        service: Disk
        root: <%= Rails.root.join('storage') %>
      

      在上面的示例中,我将文件存储在我的 rails 应用程序根目录中名为 storage 的文件夹中。在该文件夹中,您会发现不打算通过文件资源管理器/Finder 导航的嵌套文件夹(但您可以)。

      通过您的 rails 应用程序,例如通过视图,您将使用尚未充分记录的 url helpers

      在 Rails 控制台中,您可以尝试使用 Foo 的模型,使用 has_one_attached :photo

      Foo.last.photo.blob.key
      

      它应该给你一个~24 个字符的字符串。

      • 前 2 个字符是我在上面指向您的文件夹中的子文件夹
      • 接下来的 2 个字符是其中的子文件夹

      在子文件夹中是一个文件,其名称与您在上面打印的密钥相匹配(无扩展名)。那是你的文件。

      【讨论】:

      • 文件加密了吗?有什么方法可以让我在不使用 ruby​​ 代码的情况下检索基本文件?
      • 不,它们没有加密。 ActiveStorage 更改文件名(基于我认为的某种哈希)并删除扩展名,因此您会在这些子文件夹中看到一堆没有扩展名的文件。您应该能够打开它们(至少在 macOS 上),但在某些情况下您可能需要更改扩展名。
      • 我试过了,你是对的!有没有办法让它在新上传时禁用这种文件名更改,或将其映射到其原始名称?我正在查看活动存储 blobs 数据库表,它确实有每个条目的键和校验和。跟这个有关系吗?
      • 如果您要尝试禁用重命名,最好不要使用活动存储(除非我错过了文档中的某些内容)。我相信出于性能原因,它会以这种方式重命名文件。如上所示,您可以通过 blob 数据访问原始文件名。您还可以使用我链接的 url 助手获取文件名。如果您要解决某个特定问题,我或许可以为您提供解决问题的指导,但您需要提供更多详细信息,说明您要如何处理原始文件
      • 它可能不使用原始文件名的一个原因是允许多个具有相同名称的文件。例如,多个用户可能会上传一个名为 profile.png 的文件
      猜你喜欢
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2023-01-21
      相关资源
      最近更新 更多