Carrierwave Cloudinary 集成 Ruby on Rails
Posted
技术标签:
【中文标题】Carrierwave Cloudinary 集成 Ruby on Rails【英文标题】:Carrierwave Cloudinary integration Ruby on Rails 【发布时间】:2018-06-09 22:12:25 【问题描述】:我正在尝试上传某种个人资料图片,其工作原理如下:用户可以从他的计算机 (carrierwave) 中选择要上传的个人资料图片,然后他可以使用正方形 1:1 的宽高比,就像在 Whatsapp 中一样(我使用 carrierwave-crop-on-fly),最后裁剪后的图片通过 Cloudinary 上传到云端,并绑定到我的模型“用户”的“图像”列.我跟着cloudinary's tutorial做了整合
这是我到目前为止所做的。这是与cloudinary绑定的上传器:
class AvatarUploader < CarrierWave::Uploader::Base
include Cloudinary::CarrierWave
include CarrierWave::MiniMagick
process crop: [100, 100]
def public_id
model.nombre
end
end
在用户模型中:
class User < ActiveRecord::Base
mount_uploader :image, AvatarUploader
...
在我看来,我可以更改个人资料图片:
.well
.row-fluid
.span8.offset2
%p
.inline-block
= form_for @user, method: :post, url: change_photo_self_url do |f|
= f.file_field :image
.hidden#cropbox= f.cropbox :image, width: 300, height: 300
= f.submit "Crop", class: "btn btn-success blanco"
...
(当file_field改变时出现#cropbox,即检查图像时)
最后,在 users_controller 中
...
def change_photo
user = current_user
user.update_attributes(user_params)
sign_in(user)
redirect_to profile_url
end
private
def user_params
params.require(:user).permit(..., :image)
end
没有“裁剪”的东西一切都很好。也就是说,我实现了用户可以选择图像并上传它并且一切正常。但是,当我添加用于裁剪的控件时,它会崩溃。当我选择一个图像时,出现了裁剪表面,我可以完美地选择它,但是当我点击提交按钮“裁剪”时,甚至在到达控制器的动作之前就触发了以下错误:
Rack::QueryParser::ParameterTypeError at /change_photo
expected Hash (got Hash) for param `image'
这里是调用的参数:
#<Rack::QueryParser::Params:0x396f9f0 @limit=65536, @size=5, @params="image"=>:filename=>"140.jpg", :type=>"image/jpeg", :name=>"user[image]", :tempfile=>#<Tempfile:C:/Users/josem/AppData/Local/Temp/RackMultipart20171229-7548-15105ol.jpg>, :head=>"Content-Disposition: form-data; name=\"user[image]\"; filename=\"140.jpg\"\r\nContent-Type: image/jpeg\r\n">
我可能猜想两个具有相同名称的参数可能是一个问题,但我不知道如何更改它以使其工作,我不明白为什么“预期哈希(得到哈希)”是一个问题
【问题讨论】:
【参考方案1】:虽然我对“carrierwave-crop-on-fly”不太熟悉,但您可能需要考虑以不同的方式完成它。 Cloudinary 还提供开箱即用的上传小部件 (https://cloudinary.com/documentation/upload_widget),它还支持执行客户端裁剪。 这是一个基本的 RoR/CarrierWave/Cloudinary's-Upload-widget 示例项目,您可以进行测试:https://github.com/taragano/Carrierwave_widget
此项目目前不包括裁剪功能,但可以轻松添加,请参阅提供的文档页面。
您可以在小部件上设置的参数之一是 cropping_aspect_ratio
,它可能对您有所帮助。
另外,请注意,使用小部件,裁剪将在客户端完成,这将有助于加快上传速度,而且您的服务器也不需要处理裁剪。
【讨论】:
以上是关于Carrierwave Cloudinary 集成 Ruby on Rails的主要内容,如果未能解决你的问题,请参考以下文章
CKEditor Carrierwave Cloudinary
Rails carrierwave 和 cloudinary 多文件上传
使用 Cloudinary 和 Carrierwave 进行 RMagick 压缩
需要实现#cache!如果你想使用 Cloudinary::CarrierWave::Storage 作为缓存存储