我正在使用Cloudinary和jquery直接从RoR应用程序中的浏览器上传图像。我想我已完全按照here的说明进行操作了。
图片上传工作正常,但返回的参数[:image_id]似乎在#符号后附加了签名,如下所示:
"image_1_id"=>"image/upload/v1383951287/foobar.jpg#b023156dfebede65......."}
所以最终会保存在模型上。然后,当我尝试使用:
检索图像时<%= cl_image_tag(@model.image_1_id) %>
正如文档中所建议的那样,url不仅附加了签名,而且还复制了前面路径的一部分,如下所示:
http://res.cloudinary.com/.../image/upload/v1/image/upload/v1383951287/foobar.jpg%23b023156d...
显然这个链接不起作用,但是如果从末尾删除重复的路径和签名,它就可以工作。
我没有使用CarrierWave,部分原因是因为文档中很少(没有?)指令关于如何或为什么将它用于非服务器端图像上传。此外,我正在使用form_for作为图像和其他属性,这可能是问题吗?表格如下:
<%= form_for @model do |f| %>
...
<%= f.cl_image_upload(:image_1_id) %>
...
<% end %>
任何帮助非常感谢。我对这些东西很陌生,所以很可能是我错过了一些简单的东西。但值得一提的是,控制台中没有错误,JS文件似乎正确加载。
答案 0 :(得分:2)
cloudinary_gem samples文件夹中的photo album示例项目显示了如何将Cloudinary与CarrierWave集成用于直接上传和直接上传服务器的示例。
您看到的返回值按其应有的结构。这是从Cloudinary返回预加载文件URI的方式。如果您不想使用CarrierWave,您仍然可以使用PreloadedFile。将您从Cloudinary接收的内容提供给PreloadedFile
的构造函数可以实现双重目的,即允许您使用返回的签名验证上载(请参阅valid?
)并将该值转换为可以馈送的内容进入cl_image_tag
,(见identifier
)。
您可以保留完整返回的URI并在使用时将其翻译或将翻译后的值存储到数据库中。
答案 1 :(得分:0)
这是保存模型的方法。为了正确使用cl_image_tag
if params[:image_id].present?
preloaded = Cloudinary::PreloadedFile.new(params[:image_id])
raise "Invalid upload signature" if !preloaded.valid?
@category.image_id = preloaded.identifier
end