如何使用 cloudinary 和 carrierwave 上传多个文件

How to upload multiple files with cloudinary and carrierwave

我一直在 Cloudinary 文档中寻找一段时间,但无法弄清楚如何使用 Rails 和 html 表单将多个文件上传到它。

我为我的 Carrierwave 添加了 Cloudinary 支持 ImageUploader

include Cloudinary::CarrierWave

并且我将我的 api-密钥和秘密添加到 config/cloudinary.yml

但我还需要改变什么?现在,我保留了载波的所有内容。所以我的表单包含一个文件字段

<%=file_field_tag "images[]", type: :file, multiple: true %>

然后为每张图片创建一个新的 picture 实例,每个图片实例都有一个 :image 属性

if params[:images]
     params[:images].each do |image|
           @post.pictures.create(image: image)
     end
end

我或多或少保留了我的 ImageUploader 默认设置。

class ImageUploader < CarrierWave::Uploader::Base

  include Cloudinary::CarrierWave
  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end 
end

当我上传一些图片时,url 链接到一个 cloudinary 页面,但实际上没有任何内容上传到 cloudinary。我可以在 picture 控制器的 create 动作中添加一些东西来实际上传图像吗?像

def create
   @picture = Picture.new(picture_params)  
   @picture.save
   Cloudinary::Uploader.upload(picture_params)
end

根据 image 的值,您可以这样做:

if params[:images]
  params[:images].each do |image|
    @post.pictures.create(image: image)
  end
  upload_images(@post.pictures)
end

def upload_images(images)
  images.each do |i|
    Cloudinary::Uploader.upload(i)
  end
end

这是在 Paperclip 中的实现方式。

class Attachment < ApplicationRecord
  if Rails.env == 'production'
    has_attached_file :file, :storage => :cloudinary, :path => ':class/:id/:filename', :cloudinary_resource_type => :raw


class Deal < ApplicationRecord
  has_and_belongs_to_many :attachments, dependent: :destroy
  accepts_nested_attributes_for :images, :attachments, reject_if: :all_blank, allow_destroy: true

  def files=(files)
    files.each do |file|
      attachments.build(file: file)
    end
  end

#controller
def deal_params
  params.require(:deal).permit :name, ...,  photos: [], files: [] 

#view
= form_for([parent, child], html: { multipart: true }) do |f|
  =f.file_field :files, multiple: true, class: 'form-control'