【问题标题】:How to upload multiple files with cloudinary and carrierwave如何使用 cloudinary 和carrierwave 上传多个文件
【发布时间】:2015-12-05 01:19:15
【问题描述】:

我一直在寻找 Cloudinary 文档,但不知道如何使用 Rails 和 html 表单将多个文件上传到它。

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

include Cloudinary::CarrierWave

我将我的 api-key 和密码添加到 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

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

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

【问题讨论】:

  • 你上传图片的那一行代码会很好看。你应该有这样的东西:Cloudinary::Uploader.upload(your_image, auth)
  • 对不起,我更新了我的问题,但这条线似乎也没有上传它
  • 您需要将.upload 所需的授权参数定义为第二个参数。你应该这样做,并在你实际使用include Cloudinary::CarrierWave的地方使用.upload
  • 授权,是指api key和secret吗?因为这是在config/cloudinary.yml 中定义的,所以应该没问题。另外,我应该将.upload 添加到我的ImageUploader 中吗?
  • 是的,是的——这听起来很合理。随意发布上传器的一些相关部分,而不是文件字段,这对我来说很好。

标签: ruby-on-rails cloudinary


【解决方案1】:

根据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

【讨论】:

  • 这也不行,这是images 的内容,我只上传了一张图片。 "images"=&gt;[#&lt;ActionDispatch::Http::UploadedFile:0x007f330c224f48 @tempfile=#&lt;Tempfile:/tmp/RackMultipart20150909-4201-1j1o465.JPG&gt;, @original_filename="DSC00699.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"images[]\"; filename=\"DSC00699.JPG\"\r\nContent-Type: image/jpeg\r\n"&gt;]
  • 您是否尝试过上传image.tempfileimage.original_filename 而不仅仅是image。请记住,您要上传文件,而不是图像对象。
  • 我玩了一下,现在或多或少可以使用此代码。感谢 F 的所有帮助。我还有一个问题,那就是 public_id 不匹配,但我为此创建了一个新问题。 stackoverflow.com/questions/32493427/…
  • 无需手动上传图片到Cloudinary。每个循环应该足够了。
【解决方案2】:

这是在 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'

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 2019-01-24
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多