Скачать удаленный файл - PullRequest
       13

Скачать удаленный файл

1 голос
/ 25 апреля 2010

У меня есть функция, которая будет передана по ссылке. Ссылка на удаленное изображение. Я подумал, что могу просто использовать расширение файла в 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 ]

3 голосов
/ 25 апреля 2010

Вы никогда не хотите включать расширение файла. Например, не все текстовые файлы 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/*, чтобы получить изображение любого типа.

Приветствие.

0 голосов
/ 26 апреля 2010

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

0 голосов
/ 25 апреля 2010

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

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