2011-05-19 11 views
2

私は自分のコンピュータから写真をアップロードしたり、Facebookからフェッチする方法を考えています。Paperclip gemを使用しているときにFacebookから取得したプロフィール画像を保存する

私はすでにイメージをアップロードし、Paperclipプラグインを使用してイメージを保存するためのフォームを持っています。それはうまく動作します。

私はすでにFacebook認証を設定しており、FacebookグラフAPIにアクセスするためにKoalaの宝石を使用しています。

私はすでにこの方法を書いてきました:

def fetch_fb_picture 
unless current_user.authentications.blank? 
    @graph = Koala::Facebook::GraphAPI.new(current_user.authentications.find_by_provider("facebook").token) 
    @picture = @graph.get_picture("#{current_user.authentications.find_by_provider('facebook').username}") 
    current_user.profile.photo = @picture 
end 
end 

私はコアラの宝石は、画像のURLを返します信じています。しかし、私はクリップの宝石を使用していているので、私のプロファイルは、これらの属性を受け付けます。

t.string "photo_file_name" 
t.string "photo_content_type" 
t.integer "photo_file_size" 

は、どのように私は、それゆえ、適切にデータベースにFacebookの画像を保存しますか?彼らは常に、公的に入手可能であるようFaceboookグラフは常に、ユーザーのあなたのイメージを返しますよう、私はこのようにそれをやってお勧めwouldntの

r = open("http://graph.facebook.com/#{@user.facebook_id}/picture") 
image_data = r.read 
file_size = r.length 
mime_type = "image/jpeg" #fb photos always are jpg 
#write data to database, or save as temp file and upload to S3 

答えて

6

あなたのような何かを行うことができます。自分のIDまたはユーザー名の後に/ pictureを呼び出すだけです。あなたはFacebookのユーザーであるかどうかを確認するブール値を持つことができ、単にIDを使用して画像を表示することができます。これにより、最新のFacebook写真を確実に取得できます。

if @user.facebook_image? 
    image_tag "http://graph.facebook.com/#{@user.facebook_id}/picture" 
else 
    image_tag @user.photo.url(:thumb) 
end 
+0

は、私はちょうど 'Rを行うことができます=私はすでに持っているものから '@picture 'を開きますか?ユーザー名とIDの違いはありますか? – user730569

+0

Theresの違いはありません( 'Pictures' http://developers.facebook.com/docs/reference/api/を参照)が、ユーザー名が設定されていない人もいるので、そのプロフィールはhttp://www.facebookのようなものです。 http://www.facebook.com/someuserの代わりにcom/profile.php?id = 1234ですので、ユーザ名が存在しない場合は、ユーザ名を使用して画像を取得することはできません。 – Dominic

+0

あなたが動的である場合、それをFacebookのグラフから引き出しますか? – user730569

2

私はFBのプロフィール写真をgetingとS3にレールで保存について探していた、私は(rmagickを使用して)前の回答に基づいた方法を見つけた:

r = open("http://graph.facebook.com/"+params[:FacebookId]+"/picture?width=142&height=142") 
bytes = r.read 
img = Magick::Image.from_blob(bytes).first 
fmt = img.format 
data=StringIO.new(bytes) 
data.class.class_eval { attr_accessor :original_filename, :content_type } 
data.original_filename = Time.now.to_i.to_s+"."+fmt 
data.content_type='image.jpeg' 
user.profilepic = data 
user.save 
関連する問題