2010-04-25 3 views
1

У меня есть функция, которая будет передана по ссылке. Ссылка на удаленное изображение. Я думал, что могу просто использовать расширение файла в URL-адресе, чтобы определить тип изображения, но некоторые URL-адреса не будут иметь расширений в URL-адресе. Вероятно, они просто вставляют заголовки в браузер, и поэтому у меня нет расширения для разбора URL-адреса.Загрузить удаленный файл

Как проверить, имеет ли URL расширение, а если нет, то читайте заголовки, чтобы определить тип файла?

Я чем-то усложняю здесь? Есть ли более простой способ сделать это? Я использую Codeigniter, возможно, что-то уже построено для этого?

Все, что я действительно хочу сделать, это загрузить изображение из URL с правильным расширением.

Это то, что у меня есть до сих пор.

function get_image($image_link){ 

    $remoteFile = $image_link; 

    $ext = ''; //some URLs might not have an extension 

    $file = fopen($remoteFile, "r"); 


    if (!$file) { 

     return false; 

    }else{ 

     $line = ''; 

     while (!feof ($file)) { 

      $line .= fgets ($file, 4096); 

     } 

     $file_name = time().$ext; 

     file_put_contents($file_name, $line); 

    } 

    fclose($file); 

} 

Спасибо всем за любую помощь

ответ

3

Вы никогда не хотите включать расширение файла. Например, не все текстовые файлы ASCII будут иметь «.txt», а затем всегда будет весело «.jpg» против «.jpeg». Вместо этого включите заголовок Content-Type, на который отвечает веб-сервер. (См. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17).

Некоторые веб-серверы также будут уважать заголовок Accept (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1). Итак, если вы знаете, что хотите только файлы изображений PNG, отправьте Accept: image/png. Если сервер уважает его, тогда его ответ будет намного меньше, чем отправка всего нежелательного файла по сетевому соединению. Однако, поскольку не все веб-серверы делают это хорошо (если вообще), убедитесь, что вы все еще включаете заголовок ответа Content-Type. Это всего лишь пропускная способность.

Вы также можете отправить Accept: image/*, чтобы получить изображения любого типа.

Cheers.

0

Вы должны всегда использовать заголовок Content-Type ответа, чтобы определить тип данных, полученных. Из этого вы можете установить правильное расширение. URL-адреса не имеют расширений, и вы не должны полагаться на что-либо после определенного периода.

0

Вы не сможете читать заголовки, используя fsock/fread или even file_get_contents. Все это скрыто в фоновом режиме и отбрасывается при завершении поиска. Вам нужно будет использовать функции CURL и настроить соответствующий сеанс HTTP GET, используя это, из которого вы можете получить полную информацию о передаче.