1

Sinatra Web アプリ内から Cloudinary に画像をアップロードしようとしています。CarrierWave を使用してイメージをローカルに保存することができました。Cloudinary と CarrierWave が互いにうまく機能することはわかっていますが、すべてを試してみましたが、ダイスはありませんでした。

私はドキュメントに従いましたが、それらは非常にRails中心です。Railsのくそー!

# Model - User.rb
class ImageUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave

  process convert: 'png'
  version :face do
    cloudinary_transformation gravity: :face
  end
end

class User
  include DataMapper::Resource

  attr_accessor :image
  property.............
  mount_uploader :image, ImageUploader
end

# Config - app.rb

require 'carrierwave/datamapper'
require 'cloudinary'

# DataMapper code ...
# Some routes ...

post '/add' do
  user = user.create(name: params[:name])
  Cloudinary::Uploader.upload(params[:image], api_key: 'API_KEY', api_secret: 'API_SECRET', cloud_name: 'CLOUD_NAME')

# View (haml)
%head
  %script{src: "//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"}
  %script{src: "js/cloudinary_js/jquery.ui.widget.js"}               
  %script{src: "js/cloudinary_js/jquery.iframe-transport.js"}        
  %script{src: "js/cloudinary_js/jquery.fileupload.js"}              
  %script{src: "js/cloudinary_js/jquery.cloudinary.js"}
  # snip snip ...
%form{action: "/add", method: "POST", enctype: "multipart/form-data"}
  %input{type: "file", name: "image"}
  %button Submit

フォームを送信しようとしたときに発生するエラーは次のとおりです。

TypeError at /add
no implicit conversion of Hash into String

エラーの原因となっている行は、post メソッドの Cloudinary アップローダー行です。

ここに私の params[:image] ハッシュがあります

{:filename=>"batman_robin.jpg", :type=>"image/jpeg", :name=>"image", :tempfile=>#<Tempfile:/var/folders/rv/2w8gpstn4hb2lb__27n27ksh0000gn/T/RackMultipart20131223-36484-tgmaba>, :head=>"Content-Disposition: form-data; name=\"image\"; filename=\"batman_robin.jpg\"\r\nContent-Type: image/jpeg\r\n"}

ドキュメントでは、ファイルの署名について言及し、CarrierWave がこれを処理すると述べています。私の問題はアップロードフォームにあると思います。

これのどこが間違っているのですか?「cl_image_upload_tag」が生成するものと、ファイル アップロード タグに追加する必要がある Cloudinary の「特別な属性」を知っている人はいますか?

更新:だから私はそれを考え出し、実際には次のように画像を直接渡すことができます:

Cloudinary::Uploader.upload(params[:image][:filename] ...

しかし、それは今言う

No such file or directory - batman_robin.jpg

これは奇妙です。そこに URL をハードコーディングし、Cloudinary にアップロードします。何か案は?また、Cloudinary jQuery のアップロードについて何か考えはありますか?

4

2 に答える 2

1

params[:image]はハッシュですがCloudinary::Uploader.upload、最初の引数として文字列が必要です。ドキュメント内のすべての は名前または URL を示しているため、params からを渡します。:filename

post '/add' do
  user = user.create name: params[:name]
  image_meta = params[:image]
  filename = image_meta.delete :filename
  Cloudinary::Uploader.upload filename, {api_key: 'API_KEY', api_secret: 'API_SECRET', cloud_name: 'CLOUD_NAME'}.merge(image_meta)

また、これらすべてのデフォルト設定をsettingsハッシュに入れます(秘密の場合は環境から読み込ませます)。

config do
  set :cloudinary_api, {api_key: ENV['API_KEY'],
                        api_secret: ENV['API_SECRET'],
                        cloud_name: ENV['CLOUD_NAME']}
end

その後、呼び出しは…</p>

Cloudinary::Uploader.upload filename, settings.cloudinary_api.merge(image_meta)
于 2013-12-24T01:45:01.960 に答える
0

ファイル名の代わりに、保持されている実際のコンテンツを渡す必要があるため、渡す必要がありTempfileますCloudinary::Uploader.upload(params[:image][:tempfile])

于 2015-07-15T08:24:47.770 に答える