如何使用 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'
我一直在 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'