Хотите сохранить изображение facebook в моем приложении rails

Я использую ominaut для регистрации пользователей в своем приложении rails. У меня также есть базовая опция регистрации с адресом электронной почты. Таким образом, для обоих пользователей я должен сохранить загружаемое изображение пользователя в свою файловую систему. У меня есть обычная загрузка файлов для моих пользователей электронной почты, но для пользователей FB я хочу, чтобы их фотографии сохранялись на моем диске, чтобы я мог использовать тот же код и не использовать ссылку на график FB, пока отображение.

FB отправляет изображения в этом формате через API графа.

http://graph.facebook.com/100007619644580/picture?type=large

Как я могу сохранить это в своей общей папке, где я храню все пользовательские изображения.

Я старался

directory = "public/data/orig/"
      #name = num1+'_'+params[:upload]['datafile'].original_filename
      name = "new_name_for image"
      path = File.join(directory, name)
      #File.open(path, "wb") { |f| f.write(params[:upload_hover]['datafile'].read) }

      File.open(path, 'wb') do |file|
        file << open('http://graph.facebook.com/100007619644580/picture?type=large').read
      end

но это дает мне ошибку

No such file or directory @ rb_sysopen - http://graph.facebook.com/100007619644580/picture?type=large

Дайте мне знать, если у вас есть другие решения.


person Akki209    schedule 10.06.2015    source источник


Ответы (3)


Используйте свою модель, чтобы сохранить изображение на Facebook с помощью скрепки, см. ниже:

member model
def self.from_omniauth(auth, signed_in_resource=nil)
    member = Member.where(:provider => auth.provider, :uid => auth.uid).first
    if member
      member.member_pic =  "https://graph.facebook.com/#{auth["uid"]}/picture?type=large"
      member.save
      return member
    else
      registered_member = Member.where(:email => auth.info.email).first
      if registered_member
        return registered_member
      else

        member = Member.create(name:auth.extra.raw_info.name,
          provider:auth.provider,
          uid:auth.uid,
          email:auth.info.email,
          member_pic: "https://graph.facebook.com/#{auth["uid"]}/picture?type=large",
          password:Devise.friendly_token[0,20]
          )
      end    
    end
  end
person Ankit Kalia    schedule 10.06.2015

Спасибо за ответ, да, я мог бы использовать драгоценный камень скрепки, но я уже использую cloudinary для загрузки изображения, поэтому я не хотел использовать другой драгоценный камень на основе изображения только для принудительного сохранения файлов из профиля пользователя fb. Я смог отработать следующие изменения кода.

В omniauth.rb

:secure_image_url => true

для последних параметров с :scope, которые позволили мне и безопасному URL.

и в моем контроллере авторизации

 img_path = env["omniauth.auth"]["info"]["image"].gsub(/$/,'?type=large')
    require "open-uri"

  num1 = 'logo_'+SecureRandom.hex(5)
  img_name = num1+'_fbimage.jpg'
  directory = "public/data/orig/org"
  path = File.join(directory, img_name)
  File.open(path, 'wb') do |file|
    file << open(img_path).read
  end  

require "open-uri" и :secure_image_url => true помогли мне.

person Akki209    schedule 11.06.2015

В omniauth.rb

:secure_image_url => true

Действительно делает дело.

У меня есть полиморфный класс Attachment, который я присоединяю к user.photo.

Вот мои фрагменты классов Interactor и Attachment:

class CreateAttachmentFromUrl
  include Interactor
  require "open-uri"

  ## Create user service object
  # @param url => url
  # @param user => current_user
  def call
    url = context.url
    user = context.user

    file = nil
    begin
      file = URI.open(url)
    rescue => e
      file = File.open('user_avatar.jpeg', 'wb') do |file|
        file << URI.open(url).read
      end
    end

    context.attachment = Attachment.create!({ user: user }) do |a|
      a.data.attach(io: file, filename: 'user_avatar.jpeg')
    end

  rescue => e
    context.fail!(message: e.message)
  end
end

include Rails.application.routes.url_helpers

class Attachment < ApplicationRecord
  has_one_attached :data
  belongs_to :user, required: true
  belongs_to :attachable, polymorphic: true, optional: true

  def url
    if data.attached?
      uri = URI(data.service_url)
      uri.query = nil
      uri.to_s
    else
      nil
    end
  end
end

person Tim Kozak    schedule 30.11.2020