2013-12-23 3 views
1

Я пытаюсь загрузить изображение в Cloudinary из моего веб-приложения Sinatra. I получил это сохранение изображения локально с помощью CarrierWave, и я знаю, что Cloudinary и CarrierWave играют красиво друг с другом, но я пробовал все и без кубиков.Не удается загрузить изображение в Cloudinary из Sinatra

Я следил за документами, но они очень ориентированы на 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 

линия это дает мне, что является причиной ошибки является Cloudinary загрузчиком строка в методе пост.

Вот мой Params [: изображение] хэш

{: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», а какие «специальные атрибуты» CloudInfo, которые мне нужно добавить в тег загрузки файлов?

UPDATE: Так что я понял, что и я могу на самом деле просто передать изображение непосредственно следующим образом:

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

Однако теперь говорит

No such file or directory - batman_robin.jpg 

что странно. Я жестко закодировал URL-адрес, и он загружается в Cloudinary. Есть идеи? Также, любая идея о загрузке jQuery для Cloudinary?

ответ

1

params[:image] - хеш, но Cloudinary::Uploader.upload ожидает строку в качестве первого аргумента. Все examplesin the docs указывают имя или URL-адрес, поэтому передайте :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 

тогда вызов становится ...

Cloudinary::Uploader.upload filename, settings.cloudinary_api.merge(image_meta) 
0

Вместо файла вам необходимо передать фактическое содержание, которое держат в Tempfile Так проходит Cloudinary::Uploader.upload(params[:image][:tempfile]) должен работать.

Смежные вопросы