获取磁盘上 ActiveStorage 文件的路径
Get path to ActiveStorage file on disk
我需要获取磁盘上正在使用 ActiveStorage
的文件的路径。文件存储在本地。
当我使用回形针时,我在返回完整路径的附件上使用了 path
方法。
示例:
user.avatar.path
在查看 Active Storage Docs 时,看起来 rails_blob_path
可以解决问题。在查看返回的内容后,它没有提供文档的路径。因此,它 returns 这个错误:
No such file or directory @ rb_sysopen -
背景
我需要文档的路径,因为我正在使用 combine_pdf gem 以便将多个 pdf 合并为一个 pdf。
对于回形针实现,我遍历了所选 pdf 附件的 full_paths 并将它们 load
合并为合并的 pdf:
attachment_paths.each {|att_path| report << CombinePDF.load(att_path)}
感谢 @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
我觉得这个解决方案有点老套。我很想听听其他解决方案。不过这对我有用。
您可以将附件下载到本地目录,然后进行处理。
假设你的模型中有:
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
只需使用:
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
我不确定为什么所有其他答案都使用 send(:url_for, key)
。我正在使用 Rails 5.2.2 并且 path_for
是一种 public 方法,因此,最好避免使用 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>
我需要获取磁盘上正在使用 ActiveStorage
的文件的路径。文件存储在本地。
当我使用回形针时,我在返回完整路径的附件上使用了 path
方法。
示例:
user.avatar.path
在查看 Active Storage Docs 时,看起来 rails_blob_path
可以解决问题。在查看返回的内容后,它没有提供文档的路径。因此,它 returns 这个错误:
No such file or directory @ rb_sysopen -
背景
我需要文档的路径,因为我正在使用 combine_pdf gem 以便将多个 pdf 合并为一个 pdf。
对于回形针实现,我遍历了所选 pdf 附件的 full_paths 并将它们 load
合并为合并的 pdf:
attachment_paths.each {|att_path| report << CombinePDF.load(att_path)}
感谢 @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
我觉得这个解决方案有点老套。我很想听听其他解决方案。不过这对我有用。
您可以将附件下载到本地目录,然后进行处理。
假设你的模型中有:
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
只需使用:
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
我不确定为什么所有其他答案都使用 send(:url_for, key)
。我正在使用 Rails 5.2.2 并且 path_for
是一种 public 方法,因此,最好避免使用 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>