PHP + CURL Как получить имя файла - PullRequest
1 голос
/ 31 декабря 2010

Я пытаюсь загрузить изображение профиля пользователя из facebook в PHP с помощью этой функции

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 ]

2 голосов
/ 31 декабря 2010

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

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

2 голосов
/ 31 декабря 2010

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

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

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

$content_type = curl_getinfo($curl,CURLINFO_CONTENT_TYPE);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...