2015年4月6日月曜日

facebookのプロフィール写真など、外部URLの画像をS3にアップする際に注意すること的なお話

  • このエントリーをはてなブックマークに追加

Webサービスを作る際に、facebookのプロフィール写真をユーザーの顔写真にしたいことってあると思う。
もちろんその際に単純にfacebookの写真のURLをデータベースに格納すれば良いとは思うけど、
facebook連携が任意の場合だと結局のところ画像サーバー上に画像を保存しないといけない。

なので今回はfacebookの画像をS3上に保存する方法的なお話をば。

ちなみにfacebookのプロフィール写真を取ってくる方法はこちらを見るとわかりやすい。
またfuelphpでS3に画像ファイルをアップする方法はこちらを見るとわかりやすい。

ってことで簡単にまとめるとこんな感じ。

$img = file_get_contents('https://graph.facebook.com/{user_name}/picture?type=large');

/* img extension */
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_buffer($finfo, $img);
finfo_close($finfo);

switch($mime_type){
  case "image/gif":
    $img_extension = ".gif";
    break;
  case "image/jpeg":
  case "image/jpg":
    $img_extension = ".jpg";
    break;
  case "image/png":
    $img_extension = ".png";
    break;
  default:
    $img_extension = "";
    break;
}

$img_name = Str::random('unique');
\S3::put_object($img,'s3bucket',"profile_img/{$img_name}{$img_extension}","public-read",array(),$mime_type);
S3にアップする際に、通常の$_FILEからアップするのであれば問題なくmimetypeを判断してくれるのだが、
リモートURLかつキャッシュみたいな場合だと上手く判断してくれなかったりする。
(facebookのCDNは画像自体に引数とかが付いているからなのかもしれないが)

なのでfinfo_openという関数を使ってmimytypeを判断して、S3にアップする際にmimetypeを付与してあげればよい。
ということでとりあえずこんな感じでリモート画像を全てS3上にアップする事が出来るのでかなり便利。

ちなみにこの際にmimetypeを指定しないとcontent-type=application/octet-streamとなってしまうので要注意。

Adsense