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

12
АТ
На сайте с 30.12.2019
Offline
8
830

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

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


$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
459
#1

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

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
voronoff_dev
На сайте с 09.09.2019
Offline
5
#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
328
#3
Алексей Теплов:
Изображение http://http://localhost/img.jpg

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

АТ
На сайте с 30.12.2019
Offline
8
#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
328
#5
Алексей Теплов:
Если в обработчике удалить все хедеры, то как и положены браузер показывает всякую фигню, то есть картинка скачалась и выдалась браузеру как html

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

АТ
На сайте с 30.12.2019
Offline
8
#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
1550
#7

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

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

✅ Трастовых площадок под размещение статей и ссылок. Опыт 12 лет! ( https://searchengines.guru/ru/forum/675690 ) ⭐ Купить вечные трастовые ссылки для сайта ( https://getmanylinks.ru/?srh ) ⭐ Ускорение ваших сайтов (WP, Opencart и др.) + Настройка сервера ( https://searchengines.guru/ru/forum/997205 )
Samail
На сайте с 10.05.2007
Offline
328
#8
Алексей Теплов:
Кода не пишет с bom

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

LEOnidUKG
На сайте с 25.11.2006
Offline
1550
#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
8
#10

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

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


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

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

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

12

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