Отдать картинку PHP скриптом

12
Алексей Теплов
На сайте с 30.12.2019
Offline
42
1463

Здравствуйте!

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


$image = file_get_contents('http://example.com/img.jpg');
header('Content-type: image/jpeg;');
header("Content-Length: " . strlen($image));
echo $image;

Но у меня почему то выдаётся ошибка браузера "Изображение http://http://localhost/img.jpg не может быть показано, так как содержит ошибки"

Я не собираюсь выдавать картинки на сайте через этот скрипт, это нужно совсем для других целей. И слить картинки на сервер тоже не вариант, там несколько сот тысяч картинок...

S
На сайте с 30.09.2016
Offline
469
#1

Это надо смотреть конкретно, что и как там происходит. По фотокарточке не гадаем.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
VD
На сайте с 09.09.2019
Offline
34
#2

Посмотрите какие заголовки url возвращает, а то может там редирект или вообще блокирует сервер ваши запросы.


$headers = get_headers('http://example.com/img.jpg');

echo '<pre>' . print_r($headers, true) . '</pre>';

А может и в другом месте ошибка закралась:


Изображение http://http://localhost/img.jpg не может быть показано, так как содержит ошибки
Samail
На сайте с 10.05.2007
Offline
364
#3
Алексей Теплов:
Изображение http://http://localhost/img.jpg

Что за ссылка такая?

Алексей Теплов
На сайте с 30.12.2019
Offline
42
#4

Вообщем есть желание в снипет выдачи Гугля запихнуть постер клипа. Но как я уже сказал слить все постеры к себе на сервер не имею возможности, поэтому сделал реврарайт в .htaccess

RewriteRule ^pic/(.+)/hqdefault.jpg?$ pic.php?id=$1 [NC] [L]

ссылка на постер в сайтемап получилась такая

<video:thumbnail_loc>https://site.ru/pic/'.$id.'/hqdefault.jpg</video:thumbnail_loc>

Обработчик реврайта


$image = file_get_contents('https://i.ytimg.com/vi/'.$_GET['id'].'/hqdefault.jpg');
header('Content-type: image/jpeg;');
header("Content-Length: " . strlen($image));
echo $image;

Как бы всё работает.... кроме самого главного, картинка отдаётся не правильно! В браузере если забить ссылку на картинку

выдаётся ошибка браузера "Изображение http://localhost/pic/hBAHRMKQNkU/hqdefault.jpg не может быть показано, так как содержит ошибки"

Если в обработчике удалить все хедеры, то как и положены браузер показывает всякую фигню, то есть картинка скачалась и выдалась браузеру как html

Смотрю сетевым дебагером ответ сервера, не указан размер картинки пишет...

PHP стоит 7.2... если это конечно важно...

Парсер форума покалечил код php, вообщем там конечно же стоит /'.$_GET['id'].'/hqdefault.jpg

регулярка в .htaccess отрабатывает как и задуманно, в $_GET['id'] приходит именно айдишник видоса на ютубе...

Samail
На сайте с 10.05.2007
Offline
364
#5
Алексей Теплов:
Если в обработчике удалить все хедеры, то как и положены браузер показывает всякую фигню, то есть картинка скачалась и выдалась браузеру как html

Перенос строк перед php кодом или utf с boom, первое что в голову пришло. pic.php?id=$1попробуй открыть сначала

Алексей Теплов
На сайте с 30.12.2019
Offline
42
#6
Samail:
Перенос строк перед php кодом или utf с boom, первое что в голову пришло. pic.php?id=$1попробуй открыть сначала

Спасибо! Но я использую Coda 2 под Маком, он без bom пишет... Погуглил, оказывается Кода не пишет с bom и простых способов конверта файла с bom под маком пока тоже не нашёл...

---------- Добавлено 07.01.2020 в 10:54 ----------

Samail:
первое что в голову пришло. pic.php?id=$1попробуй открыть сначала

http://localhost/pic.php?id=hBAHRMKQNkU даёт точно такую же ошибку что и http://localhost/pic/hBAHRMKQNkU/hqdefault.jpg

LEOnidUKG
На сайте с 25.11.2006
Offline
1740
#7

Давайте начнём с того, что file_get_contents не очень работает с httpS и вообще не работает.

Вам нужно использовать CURL

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Samail
На сайте с 10.05.2007
Offline
364
#8
Алексей Теплов:
Кода не пишет с bom

boom и не нужен - это просто предположение что заголовки уже отправлены. Там достаточно пробела или подписи boom. У меня та-же картинка с тем-же кодом открывается нормально.

LEOnidUKG
На сайте с 25.11.2006
Offline
1740
#9

Вот такой код отлично отображает картинку.

<?php

function curl_gets($url){ //PHP7
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_ENCODING, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE,"cookie.txt");
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)');


$data = curl_exec($ch);
curl_close($ch);
return $data;
}

$image = curl_gets('https://i.ytimg.com/vi/hBAHRMKQNkU/hqdefault.jpg');
header('Content-type: image/jpeg;');
header("Content-Length: " . strlen($image));
echo $image;


---------- Добавлено 07.01.2020 в 14:29 ----------

И кстати Content-Length не обязательно передавать.
Алексей Теплов
На сайте с 30.12.2019
Offline
42
#10

Большое спасибо, всем кто откликнулся!

Вот только всё равно не работает, результат точно такой же что и у меня... :( Я подозреваю что виноваты именно вот эти строки


header('Content-type: image/jpeg;');
header("Content-Length: " . strlen($image));
echo $image;

Не кто не пробовал запустит скрипт что выложил уважаемый LEOnidUKG?

Может это только у меня такая проблема? Я вообщем то и на сервер пробовал выкладывать, результат тот же...

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий