使用 Cloudinary 和 Active Storage 时如何设置将文件上传到特定文件夹?
How do you set a file to be uploaded to a specific folder when using Cloudinary and Active Storage?
我理解当使用以下语法直接上传到 Cloudinary 并将文件夹名称作为参数传递时,这会如何下降。
Cloudinary::Uploader.upload("sample.jpg", :use_filename => true, :folder => "folder1/folder2")
但是,我使用的是 ActiveStorage,当我以上述方式上传照片时,它没有附加到我的 Post
模型,也没有以任何方式与我的应用相关联。
我正在使用以下代码附加图片
post.send(:images).attach io: StringIO.new(new_data), filename: blob.filename.to_s,
content_type: 'image'
它不接受指定文件夹的参数。我已尽力阅读 ActiveStorage 和 Cloudinary 文档,试图找到一种方法来完成这项工作,但是,我似乎无法弄清楚。
我已经看到设置自定义文件夹 header 可能是实现此功能的一种方法,但同样无法弄清楚如何为上面发生的代码设置自定义 header在下方 job
.
require 'tmpdir'
require 'fileutils'
require 'open-uri'
class ResizeImagesJob < ApplicationJob
queue_as :default
def perform(post)
post.images.each do |image|
blob = image.blob
blob.open do |temp_file|
path = temp_file.path
pipeline = ImageProcessing::MiniMagick.source(path)
.resize_to_limit(1200, 1200)
.call(destination: path)
new_data = File.binread(path)
post.send(:images).attach io: StringIO.new(new_data), filename: blob.filename.to_s,
content_type: 'image'
end
image.purge_later
end
end
end
上面的工作是等到创建 post 之后,然后调整照片大小并将照片重新附加到 post 井中,删除原件。我正在采用这种方法来避免上传后直接在 Cloudinary 上调整 post 大小时发生的完整性错误。
我想做的是将调整大小后的照片存储在不同的文件夹中。这样做的原因是我正在使用 direct_upload
并且用户可以在不创建 post 的情况下上传照片。因此导致我存储未使用的照片。这将提供一种简单的方法来识别和处理此类图像。
默认情况下,Cloudinary Active Storage 服务上传到 Cloudinary 帐户的根目录。如果您想将文件上传到不同的基本文件夹,则可以在 storage.yml
文件中进行配置。为此,您可以添加 folder
选项并将其设置为您希望 Cloudinary 服务将资源上传到的文件夹 -
cloudinary_gallery:
service: Cloudinary
folder: my_gallery_images
如果您要查找的不是基本文件夹,而是要动态更改上传文件的文件夹 per-upload,那么,简而言之,这是不支持的。 Cloudinary Active Storage 服务的实现类似于其他存储提供商,例如 Azure 存储、Google 云存储或 Amazon S3。作为存储服务,其主要功能是在集成服务上存储文件,但 Active Storage 无法支持许多自定义上传流程,例如每次上传动态更改存储路径(文件夹)。 Cloudinary 本身支持此功能,但由于标准 Active Storage 服务集成方式的限制,这意味着它目前不受 Active Storage 支持。
但是,致力于 Rails/Active 存储的开发人员计划在即将发布的版本中进行更新,以支持为同一服务定义多个活动存储适配器。这将允许您在 storage.yml
文件中配置多个 Cloudinary 配置,然后可以为每个附件配置这些配置。合并了一个 Pull request 来支持这个 - https://github.com/rails/rails/pull/34935.
利用上面的变化,我们可以做这样的事情-
在storage.yml
cloudinary_profiles:
service: Cloudinary
folder: profiles
cloudinary_images:
service: Cloudinary
folder: images
然后你可以这样做(不同的附件可以引用不同的适配器)-
class User < ApplicationRecord
has_one_attached :profile, service: :cloudinary_profiles
has_many_attached :images, service: :cloudinary_images
end
如果您需要将单个附件动态上传到不同的文件夹(或应用不同的上传 parameters/configurations),那么活动存储通常不适用于此 use-case,因为Active Storage 服务基于其标准实现的约束。您可以在没有 Active Storage 的情况下使用 Cloudinary Ruby SDK,根据您的 use-case.
进行更多 fine-grained 控制
文件夹名称基于 Rails 环境
您可以在 storage.yml 上动态设置您的文件夹:
cloudinary:
service: Cloudinary
folder: <%= Rails.env %>
因此 Cloudinary 将根据您的 Rails 环境自动创建文件夹:
这是一个带有 Active Storage 的 long due issue,Cloudinary 团队似乎已经解决了这个问题。感谢您的出色工作❤️
我理解当使用以下语法直接上传到 Cloudinary 并将文件夹名称作为参数传递时,这会如何下降。
Cloudinary::Uploader.upload("sample.jpg", :use_filename => true, :folder => "folder1/folder2")
但是,我使用的是 ActiveStorage,当我以上述方式上传照片时,它没有附加到我的 Post
模型,也没有以任何方式与我的应用相关联。
我正在使用以下代码附加图片
post.send(:images).attach io: StringIO.new(new_data), filename: blob.filename.to_s,
content_type: 'image'
它不接受指定文件夹的参数。我已尽力阅读 ActiveStorage 和 Cloudinary 文档,试图找到一种方法来完成这项工作,但是,我似乎无法弄清楚。
我已经看到设置自定义文件夹 header 可能是实现此功能的一种方法,但同样无法弄清楚如何为上面发生的代码设置自定义 header在下方 job
.
require 'tmpdir'
require 'fileutils'
require 'open-uri'
class ResizeImagesJob < ApplicationJob
queue_as :default
def perform(post)
post.images.each do |image|
blob = image.blob
blob.open do |temp_file|
path = temp_file.path
pipeline = ImageProcessing::MiniMagick.source(path)
.resize_to_limit(1200, 1200)
.call(destination: path)
new_data = File.binread(path)
post.send(:images).attach io: StringIO.new(new_data), filename: blob.filename.to_s,
content_type: 'image'
end
image.purge_later
end
end
end
上面的工作是等到创建 post 之后,然后调整照片大小并将照片重新附加到 post 井中,删除原件。我正在采用这种方法来避免上传后直接在 Cloudinary 上调整 post 大小时发生的完整性错误。
我想做的是将调整大小后的照片存储在不同的文件夹中。这样做的原因是我正在使用 direct_upload
并且用户可以在不创建 post 的情况下上传照片。因此导致我存储未使用的照片。这将提供一种简单的方法来识别和处理此类图像。
默认情况下,Cloudinary Active Storage 服务上传到 Cloudinary 帐户的根目录。如果您想将文件上传到不同的基本文件夹,则可以在 storage.yml
文件中进行配置。为此,您可以添加 folder
选项并将其设置为您希望 Cloudinary 服务将资源上传到的文件夹 -
cloudinary_gallery:
service: Cloudinary
folder: my_gallery_images
如果您要查找的不是基本文件夹,而是要动态更改上传文件的文件夹 per-upload,那么,简而言之,这是不支持的。 Cloudinary Active Storage 服务的实现类似于其他存储提供商,例如 Azure 存储、Google 云存储或 Amazon S3。作为存储服务,其主要功能是在集成服务上存储文件,但 Active Storage 无法支持许多自定义上传流程,例如每次上传动态更改存储路径(文件夹)。 Cloudinary 本身支持此功能,但由于标准 Active Storage 服务集成方式的限制,这意味着它目前不受 Active Storage 支持。
但是,致力于 Rails/Active 存储的开发人员计划在即将发布的版本中进行更新,以支持为同一服务定义多个活动存储适配器。这将允许您在 storage.yml
文件中配置多个 Cloudinary 配置,然后可以为每个附件配置这些配置。合并了一个 Pull request 来支持这个 - https://github.com/rails/rails/pull/34935.
利用上面的变化,我们可以做这样的事情-
在storage.yml
cloudinary_profiles:
service: Cloudinary
folder: profiles
cloudinary_images:
service: Cloudinary
folder: images
然后你可以这样做(不同的附件可以引用不同的适配器)-
class User < ApplicationRecord
has_one_attached :profile, service: :cloudinary_profiles
has_many_attached :images, service: :cloudinary_images
end
如果您需要将单个附件动态上传到不同的文件夹(或应用不同的上传 parameters/configurations),那么活动存储通常不适用于此 use-case,因为Active Storage 服务基于其标准实现的约束。您可以在没有 Active Storage 的情况下使用 Cloudinary Ruby SDK,根据您的 use-case.
进行更多 fine-grained 控制文件夹名称基于 Rails 环境
您可以在 storage.yml 上动态设置您的文件夹:
cloudinary:
service: Cloudinary
folder: <%= Rails.env %>
因此 Cloudinary 将根据您的 Rails 环境自动创建文件夹:
这是一个带有 Active Storage 的 long due issue,Cloudinary 团队似乎已经解决了这个问题。感谢您的出色工作❤️