【问题标题】:How do you set a file to be uploaded to a specific folder when using Cloudinary and Active Storage?使用 Cloudinary 和 Active Storage 时,如何设置要上传到特定文件夹的文件?
【发布时间】:2021-01-27 13:28:14
【问题描述】:

我了解使用以下语法直接上传到 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,用户可以上传照片而无需创建帖子。从而导致我存储未使用的照片。这将提供一种识别和处理此类图像的简单方法。

【问题讨论】:

    标签: ruby-on-rails http-headers jobs cloudinary rails-activestorage


    【解决方案1】:

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

    您可以在 storage.yml 上动态设置您的文件夹:

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

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

    这是一个 long due issue,带有 Active Storage,Cloudinary 团队似乎已经解决了这个问题。感谢您的出色工作❤️

    【讨论】:

      【解决方案2】:

      默认情况下,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。作为一个Storage服务,它的主要功能是在集成服务上存储文件,但是Active Storage不能支持很多自定义的上传流程,比如每次上传时动态改变Storage路径(文件夹)。 Cloudinary 本身支持此功能,但由于标准 Active Storage 服务集成方式的限制,这意味着当前不支持 Active Storage。

      不过,开发 Rails/Active Storage 的开发人员计划在即将发布的版本中进行更新,以支持为同一服务定义多个 Active Storage 适配器。这将允许您在 storage.yml 文件中配置多个 Cloudinary 配置,然后可以针对每个附件进行配置。有一个合并请求以支持此请求 - 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 通常不适用于此用例有基于他们的标准实现。您可以使用 Cloudinary Ruby SDK 而不使用 Active Storage,根据您的用例进行更细粒度的控制。

      【讨论】:

      • 感谢您的回答。不幸的是,我的特定用例不受支持,甚至在更新中也可能不受支持。然而,我很欣赏伟大的解释,很高兴听到 Cloudinary 正在努力让事情变得更好。谢谢。
      • 首先感谢您的解释。第二,这个功能已经实现了吗?
      猜你喜欢
      • 2021-04-27
      • 2018-11-26
      • 2021-04-15
      • 2019-08-25
      • 2021-04-18
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      相关资源
      最近更新 更多