【问题标题】:How to update avatar/photo of a model directly?如何直接更新模型的头像/照片?
【发布时间】:2011-06-07 11:31:26
【问题描述】:

这是 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 %>

感谢任何帮助,谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 paperclip ruby-on-rails-plugins


    【解决方案1】:

    从您上面指向 Canvas2Image 的链接来看,在我看来您正在尝试处理 Base64 编码的图像(例如 data:image/octet-stream;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wB)。

    Paperclip 需要一个 Tempfile 对象,该对象是在您上传图片时在后台为您创建的。可以通过使用StringIO 对象并添加content_typeoriginal_filename 实例方法来伪造Tempfile

    我发布了一个要点,其中包含用于在我的一个项目中完成此操作的代码。 https://gist.github.com/1012107.

    要执行类似操作,您需要删除 Canvas2Image URI data:image/octet-stream;base64, 的开头部分,并将剩余的 Base64 代码用作 image_data。您需要一种方法来提供或解决内容类型和文件名。

    如果您只想使用普通的 URL,例如 http://example.com/image.jpg,那么您有几个可用的选项。

    您可以简单地保存 URL 并将其用作页面上的图像源。我知道这并不总是一种选择,而且您无法控制图像的可用性。

    否则,您可以使用一些实用程序(例如 net/http 和 curl)来下载图像。如果你认为你想走这条路,那么你也可以考虑使用延迟作业或类似的后台进程来下载图像。这样,如果图像下载速度很慢,您的 UI 就不会挂起。

    【讨论】:

    • 这与我的问题有关。我想知道你的内容类型和文件名是什么意思?内容类型如 PNG、JPG 等?代码中的文件名是否提供了一个而不是图像数据作为名称?干杯。
    • 是的,内容类型为 PNG、JPG 等。
    • 我认为在您的情况下自动生成文件名是个好主意。
    • 在您的要点中,是否假设所有通过的图像都是 Base64 编码的?
    • 不,常规文件上传也可以。事实上,我从中提取示例的应用程序使用了这两种方法。 Web UI使用普通文件上传,JSON API使用Base64方式,方便用户从iPhone App上传照片。
    【解决方案2】:

    如果您想使用用户的电子邮件地址获取 gravatar,您可以使用以下代码 sn-p。

    在助手中:

    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 帐户的照片。请让我知道它是否解决了您的问题。

    【讨论】:

    • 嗨福阿德!这对我的用户个人资料来说太棒了。但现在,它不是我要找的。我的用户有很多(has_many 关系)原型,并且这些原型附有图像!只是想知道如何让用户通过画布编辑这些图像并将其直接保存到服务器。(我的最终目标)
    【解决方案3】:

    This link 可能就是你要找的东西

    但是,如果您还没有使用回形针做太多工作,我建议您换用 CarrierWave。 同样的事情用两行代码完成:

    @prototype.image_remote_url = canvas2image_url #you should change this
    @prototype.save
    

    【讨论】:

    • 嘿,贝司颈!谢谢回答。我已经用 Paperclip 实现了这个功能(我提到“用户可以使用 URL 上传照片”)。尽管如此,它还是要求用户提供图像的 URL。我在问如何使用 Canvas2Image 提供的图像来做到这一点(查看我的演示链接)。用户在画布上绘制,将其转换为图像并按下按钮以覆盖原型的当前图像!
    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多