42

我需要获取磁盘上正在使用的文件的路径ActiveStorage。该文件存储在本地。

当我使用回形针时,我使用了path返回完整路径的附件上的方法。

例子:

user.avatar.path

在查看Active Storage Docs时,它看起来rails_blob_path可以解决问题。在查看了它返回的内容之后,它没有提供文档的路径。因此,它返回此错误:

没有这样的文件或目录@rb_sysopen -

背景

我需要文档的路径,因为我正在使用combine_pdf gem 将多个 pdf 组合成一个 pdf。

对于回形针的实现,我遍历了所选 pdf 附件的 full_paths 并将load它们放入组合的 pdf 中:

attachment_paths.each {|att_path| report << CombinePDF.load(att_path)}
4

4 回答 4

45

只需使用:

ActiveStorage::Blob.service.path_for(user.avatar.key)

你可以在你的模型上做这样的事情:

class User < ApplicationRecord
  has_one_attached :avatar

  def avatar_on_disk
    ActiveStorage::Blob.service.path_for(avatar.key)
  end
end
于 2018-08-06T13:54:47.503 回答
39

我不确定为什么所有其他答案都使用send(:url_for, key). 我正在使用Rails 5.2.2并且path_for是一个公共方法,因此,最好避免send或简单地调用path_for

class User < ApplicationRecord
  has_one_attached :avatar

  def avatar_path
    ActiveStorage::Blob.service.path_for(avatar.key)
  end
end

值得注意的是,在视图中您可以执行以下操作:

<p>
  <%= image_tag url_for(@user.avatar) %>
  <br>
  <%= link_to 'View', polymorphic_url(@user.avatar) %>
  <br>
  Stored at <%= @user.image_path %>
  <br>
  <%= link_to 'Download', rails_blob_path(@user.avatar, disposition: :attachment) %>
  <br>
  <%= f.file_field :avatar %>
</p>
于 2018-12-24T01:18:47.093 回答
9

感谢@muistooshort 在评论中的帮助,在查看了Active Storage Code之后,这很有效:

active_storage_disk_service = ActiveStorage::Service::DiskService.new(root: Rails.root.to_s + '/storage/')
active_storage_disk_service.send(:path_for, user.avatar.blob.key)
  # => returns full path to the document stored locally on disk

这个解决方案对我来说有点hacky。我很想听听其他解决方案。不过,这对我有用。

于 2018-05-15T14:44:44.447 回答
8

您可以将附件下载到本地目录,然后进行处理。

假设您的模型中有:

has_one_attached :pdf_attachment

您可以定义:

def process_attachment      
   # Download the attached file in temp dir
   pdf_attachment_path = "#{Dir.tmpdir}/#{pdf_attachment.filename}"
   File.open(pdf_attachment_path, 'wb') do |file|
       file.write(pdf_attachment.download)
   end   

   # process the downloaded file
   # ...
end
于 2018-06-13T13:35:35.693 回答