2010-12-31 9 views
1

Я пытаюсь загрузить пользователей фотографию из Facebook в PHP с помощью этой функции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 не имеет имя файла в заголовках

ответ

2

Если URL перенаправляет к изображению, вы все равно должны иметь возможность получить имя файла из заголовков. Используя браузер с инструментами разработчика, такими как Chrome, вы можете посмотреть заголовки, возвращающиеся из исходного запроса в результирующий файл, и имя файла должно быть где-то там. С учетом сказанного у меня сложилось впечатление, что Facebook переписывает все изображения в собственные имена файлов по соображениям конфиденциальности.

Вы можете воссоздать расширение на основе типа содержимого ответа.

После запуска curl_exec(), попробуйте:

$content_type = curl_getinfo($curl,CURLINFO_CONTENT_TYPE); 

Это вернет что-то вроде "изображение/JPG" для JPEG, например. Затем вы можете переименовать свой временный файл, чтобы иметь соответствующее расширение.

Если вы можете использовать PHP 5.3, возможно, более чистым способом сделать это будет просто вызов finfo_file() в файл после его загрузки, который должен прочитать тип MIME, что позволит вам выбрать правильное расширение, не полагаясь на данные заголовка. finfo_file() также доступен в расширении fileinfo PECL.

2

Если вы ищете тип изображения (jpg/png/gif), и у вас есть расширение GD, вы можете использовать getimagesize, он возвращает тип изображения вместе с другими деталями. Это более точно, чем просмотр расширения файла.

image_type_to_mime_type также может помочь после того, как вы использовали getimagesize.