2010-12-31 9 views
1

私は、この機能を使用して、ユーザーがPHPでのFacebookのプロフィール写真をダウンロードしようとしているPHP + CURLは

public static function downloadFile($url, $options = array()) 
{ 
    if (!is_array($options)) 
     $options = array(); 
    $options = array_merge(array(
           'connectionTimeout' => 5, // seconds 
           'timeout' => 10, // seconds 
           'sslVerifyPeer' => false, 
           'followLocation' => true, // if true, limit recursive redirection by 
           'maxRedirs' => 2, // setting value for "maxRedirs" 
           ), $options); 

    // create a temporary file (we are assuming that we can write to the system's temporary directory) 
    $tempFileName = tempnam(sys_get_temp_dir(), ''); 
    $fh = fopen($tempFileName, 'w'); 

    $curl = curl_init($url); 
    curl_setopt($curl, CURLOPT_FILE, $fh); 
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $options['connectionTimeout']); 
    curl_setopt($curl, CURLOPT_TIMEOUT, $options['timeout']); 
    curl_setopt($curl, CURLOPT_HEADER, false); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $options['sslVerifyPeer']); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $options['followLocation']); 
    curl_setopt($curl, CURLOPT_MAXREDIRS, $options['maxRedirs']); 
    curl_exec($curl); 

    curl_close($curl); 
    fclose($fh); 

    return $tempFileName; 
} 

問題は、それがランダムな名前で/ tmpディレクトリ内のファイルを保存しています拡張なしで。どのように私は(私は、元の拡張で、より興味)ファイルの元の名前を取得することができます

ここで重要なことは、次のとおりです。私は、元からそれを得る傾けるよう

  • urlは実際に画像にリダイレクトURL
  • は、最終的なURLは、URLがイメージにリダイレクトする場合、あなたはまだヘッダからファイル名を取得することができるはずヘッダ

答えて

2

でファイル名を持っていません。 Chromeのような開発ツールを備えたブラウザを使用すると、元のリクエストから結果のファイルに行き来するヘッダーを見ることができます。ファイル名はどこかにある必要があります。それで、私はFacebookがプライバシー上の理由からすべての画像を自分のファイル名に書き換えるという印象を受けました。

応答のコンテンツタイプに基づいて拡張機能を再作成できます。

curl_exec()を実行した後、試してみてください。

$content_type = curl_getinfo($curl,CURLINFO_CONTENT_TYPE); 

これは、例えば、JPEGのための "画像/ JPG" のようなものを返します。その後、適切な拡張子を持つように一時ファイルの名前を変更することができます。

PHP 5.3を使用することができれば、これを行うよりきれいな方法は、ファイルのダウンロード後にfinfo_file()を呼び出すことです。これはMIMEタイプを読み取る必要があるため、依存せずに適切な拡張子を選択する必要がありますオンヘッダーデータ。 finfo_file()は、fileinfo PECL拡張でも使用できます。

2

画像タイプ(jpg/png/gif)を探していて、GD拡張機能がインストールされている場合は、getimagesizeを使用できます。画像タイプと他の詳細が返されます。ファイル拡張子を調べるよりも正確です。

image_type_to_mime_typeは、getimagesizeを使用した後にも役立ちます。