Ruby Can';t从Sinatra向Cloudinary上传图像
我正在尝试从我的Sinatra web应用程序中将图像上载到Cloudinary。我 使用CarrierWave在本地保存图像,我知道Cloudinary和 卡里尔和对方玩得很好,但我什么都试过了,没有掷骰子 我关注过这些文档,但它们非常以Rails为中心。该死的铁轨Ruby Can';t从Sinatra向Cloudinary上传图像,ruby,sinatra,carrierwave,ruby-datamapper,cloudinary,Ruby,Sinatra,Carrierwave,Ruby Datamapper,Cloudinary,我正在尝试从我的Sinatra web应用程序中将图像上载到Cloudinary。我 使用CarrierWave在本地保存图像,我知道Cloudinary和 卡里尔和对方玩得很好,但我什么都试过了,没有掷骰子 我关注过这些文档,但它们非常以Rails为中心。该死的铁轨 # Model - User.rb class ImageUploader < CarrierWave::Uploader::Base include Cloudinary::CarrierWave process
# 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
它给我的导致错误的行是post方法中的Cloudinary uploader行
这是我的参数[: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"}
但是现在它说
No such file or directory - batman_robin.jpg
这很奇怪。我在那里硬编码了一个URL,并将其上传到Cloudinary。有什么想法吗?另外,对Cloudinary jQuery上传有什么想法吗?
params[:image]
是一个散列,但Cloudinary::Uploader.upload
需要一个字符串作为第一个参数。所有参数都提供一个名称或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
hash(如果它们是机密的,则让它们从环境中读取),例如
然后电话变成
Cloudinary::Uploader.upload filename, settings.cloudinary_api.merge(image_meta)
您需要传递的不是文件名,而是保存在
Tempfile
中的实际内容,因此传递Cloudinary::Uploader.upload(params[:image][:Tempfile])
应该有效
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)
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)