#ruby-on-rails #ruby-on-rails-3 #paperclip #ruby-on-rails-plugins
#ruby-on-rails #ruby-on-rails-3 #скрепка #ruby-on-rails-плагины
Вопрос:
Это rails 3.0.x. Мне просто интересно, как обновить атрибут фотографии / аватара модели напрямую, не запрашивая пользователя о загрузке из его / ее системы?
Я использую скрепку для прикрепления фотографии к модели; У нее есть расширение, чтобы пользователь мог использовать URL для загрузки фотографии. Это работает.
Теперь я просматривал Canvas2Image, и он возвращает изображение холста, чтобы пользователь мог их загрузить.
Мне было интересно, как использовать URL, который возвращает Canvas2Image, чтобы я мог напрямую обновлять фотографию текущей модели?
На данный момент у меня есть эта форма, которая предлагает пользователю обновить аватар / фотографию текущей модели:
<% 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 %>
Любая помощь приветствуется, спасибо!
Ответ №1:
Судя по вашей ссылке на Canvas2Image выше, мне кажется, что вы пытаетесь обрабатывать изображения в кодировке Base64 (например data:image/octet-stream;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wB
).
Paperclip ожидает Tempfile
объект, который создается за кулисами для вас, когда вы загружаете изображение. Можно подделать Tempfile
с помощью StringIO
объекта и добавления методов content_type
и original_filename
экземпляра.
Я опубликовал суть кода, который я использовал для выполнения этого в одном из своих проектов. https://gist.github.com/1012107 .
Чтобы сделать что-то подобное, вам нужно было бы удалить начальную часть URI Canvas2Image data:image/octet-stream;base64,
и использовать оставшийся код Base64 в качестве image_data. Вам понадобится способ указать тип содержимого и имя файла или обойти его.
Если вы просто хотите использовать обычные URL, такие как http://example.com/image.jpg
, тогда у вас есть несколько доступных вариантов.
Вы могли бы просто сохранить URL и использовать его в качестве источника изображения на своих страницах. Я знаю, что это не всегда возможно, и вы не можете контролировать доступность изображения.
В противном случае есть несколько утилит, таких как net / http и curl, которые вы могли бы использовать для загрузки изображения. Если вы считаете, что хотите пойти по этому пути, вы также можете рассмотреть возможность загрузки изображений с использованием отложенных заданий или аналогичного фонового процесса. Таким образом, ваш пользовательский интерфейс не зависает, если загрузка изображения происходит медленно.
Комментарии:
1. Это имеет отношение к моему вопросу. Мне было интересно, что вы имели в виду под типом содержимого и именем файла? Тип контента, как в, PNG, JPG и т.д.? Имя файла, как в коде, должно указывать одно вместо данных изображения в качестве имени? Приветствия.
2. Да, тип содержимого в формате PNG, JPG и т.д.
3. Я думаю, что автоматическая генерация имени файла в вашем случае была бы хорошей идеей.
4. По вашей сути, предполагается ли, что все проходящие изображения закодированы в Base64?
5. Нет, обычная загрузка файлов тоже работает. На самом деле приложение, из которого я извлек пример, использует оба метода. Обычная загрузка файла используется для веб-интерфейса, а метод Base64 используется для JSON API, чтобы пользователи могли загружать фотографии из приложения для iPhone.
Ответ №2:
Если вы хотите получить изображение, используя адрес электронной почты пользователя, вы можете использовать следующий фрагмент кода.
В помощнике:
def avatar_url(user)
gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
return "http://gravatar.com/avatar/#{gravatar_id}.png?s=48amp;d=#{CGI.escape(default_url)}"
end
На ваш взгляд:
<%= link_to(image_tag(avatar_url(user)), user_path(user))%>
Вот и все! Вам не нужно просить пользователя загрузить вашу фотографию в вашу систему. В нем будет показана фотография его учетной записи gravatar. Пожалуйста, дайте мне знать, решает ли это вашу проблему.
Комментарии:
1. Привет, Фуад! Это замечательно для профиля моего пользователя. Однако прямо сейчас это не то, что я ищу. У моих пользователей есть много прототипов (отношение has_many), и к этим прототипам прикреплено изображение! Просто интересно, как я могу позволить пользователям редактировать эти изображения через холст и сохранять их непосредственно на сервер. (Моя конечная цель)
Ответ №3:
Эта ссылка может быть тем, что вы ищете
Однако, если вы еще не много поработали с paperclip, я бы порекомендовал вам переключиться на CarrierWave. То же самое делается с помощью двух строк кода:
@prototype.image_remote_url = canvas2image_url #you should change this
@prototype.save
Комментарии:
1. Эй, баснек! Спасибо, что ответили. Я уже внедрил эту функцию с помощью Paperclip (я упоминал «пользователь может использовать URL для загрузки фотографии»). Тем не менее, он просит пользователя указать URL для изображения. Я спрашивал, как это сделать, используя изображение, предоставленное Canvas2Image (посмотрите на мою ссылку для демонстрации). Где пользователь рисует на холсте, преобразует его в изображение и нажимает кнопку, чтобы перезаписать текущее изображение прототипа!