ruby-on-rails 使用Cloudinary和Active Storage时,如何设置要上传到特定文件夹的文件?

ldioqlga  于 2022-11-26  发布在  Ruby
关注(0)|答案(3)|浏览(148)

我理解当使用下面的语法直接上传到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文档,试图找到一种方法来使此工作,然而,我似乎无法弄清楚。
我已经看到,设置一个自定义文件夹标题可能是一种方法,让这一工作,但再次无法弄清楚如何设置自定义标题为上述代码发生在下面的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

上面的工作是等待,直到一个职位被创建,然后调整大小和重新附加的照片到职位以及删除原件.我采取这种方法,以避免发生完整性错误,调整大小后,直接在Cloudinary上的职位上传.
我想做的是将调整大小后的照片存储在另一个文件夹中。这样做的原因是,我使用的是direct_upload,用户可能会上传照片而不创建帖子。因此,我会存储未使用的照片。这将提供一个简单的方法来识别和处理此类图像。

6jygbczu

6jygbczu1#

对于基于Rails环境的文件夹名称

您可以动态设置您的文件夹在存储。yml:

cloudinary:
  service: Cloudinary
  folder: <%= Rails.env %>

所以Cloudinary会根据您的Rails环境自动创建文件夹:

这是一个带有Active Storage的long due issue,似乎已经被Cloudinary团队解决了。感谢你的惊人工作️

vdzxcuhz

vdzxcuhz2#

默认情况下,Cloudinary Active Storage服务上传到Cloudinary帐户的根目录。如果您想上传文件到不同的基本文件夹,那么您可以在storage.yml文件中进行配置。为此,您需要添加folder选项,并将其设置为您希望Cloudinary服务将资源上传到的文件夹-

cloudinary_gallery:
  service: Cloudinary
  folder: my_gallery_images

如果你要找的不是基本文件夹,而是每次上传时动态改变上传文件的文件夹,那么,简而言之,这是不支持的。Cloudinary Active Storage服务的实现方式与其他存储提供商类似,如Azure Storage、Google Cloud Storage或Amazon S3。作为一个存储服务,它的主要功能是将文件存储在集成服务上,但Active Storage无法支持许多自定义上传流,例如每次上传时动态更改存储路径(文件夹)。Cloudinary本身支持此功能,但由于标准Active Storage服务集成方式的限制,这意味着Active Storage目前不支持此功能。
然而,Rails/Active Storage的开发人员计划在即将到来的版本中进行更新,以支持为同一服务定义多个Active Storage适配器。这将允许您在storage.yml文件中配置多个Cloudinary配置,然后可以为每个附件配置。有一个合并的Pull请求以支持此-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

如果您需要将单个附件动态上传到不同的文件夹(或应用不同的上传参数/配置),那么Active Storage通常不适用于此用例,因为Active Storage服务基于其标准实现的限制。您可以使用不带Active Storage的Cloudinary Ruby SDK,根据您的用例进行更细粒度的控制。

xeufq47z

xeufq47z3#

我刚刚测试过这个,它可以工作。你可以在你的storage.yml文件中写一些ruby代码,告诉Cloudinary把你的文件存放在一个不同的预定义文件夹中,并且对于生产和开发环境是不同的:

<% if Rails.env == "development" %>
  <% test = "test-dev" %>
<% else %>
  <% test = "test-prod" %>
<% end %>

cloudinary:
  service: Cloudinary
  folder: <%= test %>

我希望这对你有帮助!

相关问题