这是rails 3.0.x。我只是想知道如何在不提示用户从他/她的系统上传的情况下直接更新模特照片/头像的属性?
我正在使用Paperclip将照片附加到模型上;它有一个扩展,用户可以使用URL上传照片。这是有效的。
现在,我看到了Canvas2Image,它返回了画布的图像,这样用户就可以下载它们。
我想知道如何使用Canvas2Image返回的URL,以便直接更新当前模特的照片?
目前,我有一个提示用户更新当前模特头像/照片的表单:
<% form_for(@prototype,
:url=>{:controller=>"prototypes",
:action=>"update"},
:html => { :multipart => true }) do |f| %>
<%= f.file_field :avatar %><br><br>
<%= f.text_field :image_url %><br><br>
<%= submit_tag "Save Prototype" %>
<% end %>
感谢您的帮助!
从您到上面Canvas2Image的链接来看,您似乎正在尝试处理Base64编码的图像(如data:image/octet-stream;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wB
)。
Paperclip需要一个Tempfile
对象,它是在上传图像时在后台为您创建的。可以通过使用StringIO
对象并添加content_type
和original_filename
实例方法来伪造Tempfile
。
我发布了一个要点,其中包含我在一个项目中用来实现这一点的代码。https://gist.github.com/1012107.
为了执行类似的操作,您需要删除Canvas2ImageURI data:image/octet-stream;base64,
的开头部分,并使用剩余的Base64代码作为image_data。您需要一种方法来提供或处理内容类型和文件名。
如果你只想使用像http://example.com/image.jpg
这样的普通URL,那么你有几个可用的选项。
您可以简单地保存URL并将其用作页面上的图像源。我知道这并不总是一个选择,你无法控制图像的可用性。
否则,您可以使用nethttp和curl等一些实用程序来下载图像。如果你认为你想走这条路,那么你也可以考虑使用延迟作业或类似的后台进程下载图像。这样,如果图像下载速度较慢,用户界面就不会挂起。
如果您想使用用户的电子邮件地址获取gravatar,可以使用以下代码片段。
在助手中:
def avatar_url(user)
gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
return "http://gravatar.com/avatar/#{gravatar_id}.png?s=48&d=#{CGI.escape(default_url)}"
end
在您看来:
<%= link_to(image_tag(avatar_url(user)), user_path(user))%>
就是这样!您不需要要求用户在您的系统中上传您的照片。它将显示他的gravatar帐户的照片。请告诉我它是否能解决你的问题。
此链接可能是您要查找的
然而,如果你还没有对回形针做太多的工作,我建议你换成CarrierWave。同样的事情是用两行代码完成的:
@prototype.image_remote_url = canvas2image_url #you should change this
@prototype.save