Задать вопрос

Почему при копировании файла результующий файл отличаеться одним байтом?

Есть задача - копировать изображения с инстаграма на сервер.

Также есть баг, который пока что был замечен только с одним изображением и только на хостинге заказчика. На локалке и на dev-сервере все работает правильно.

За копирование изображения отвечает код:
$arrContextOptions = array(
    "ssl" => array(
        "verify_peer" => false,
        "verify_peer_name" => false,
    ),
);

$img = 'https://scontent.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/11378546_468565866637366_80199982_n.jpg';
$upload_dir = $_SERVER["DOCUMENT_ROOT"] . '/';

$imageString = file_get_contents($img, false, stream_context_create($arrContextOptions));
$save = file_put_contents($upload_dir .  basename($img), $imageString);


В результате скопированое изображение не открываеться - Invalid jpeg file structure: two SOI markers. Если вручную скачать изображение и побайтово сравнить его с копией, созданной скриптом то:
cmp --print-char 11378546_468565866637366_80199982_n.jpg 0611378546_468565866637366_80199982_n.jpg
differ: byte 65537, line 224 is 372 M-z 377 M-^?


То есть отличается один 65537-ой байт.

Почему такое может получаться? В какую сторону копать? Может есть какие-то настройки в php.ini которые косвенно могут влиять на file_get\put_contents?
  • Вопрос задан
  • 562 просмотра
Подписаться 7 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@justpusher
Рассмотрите ещё вариант, что вы от этого сайта получаете неправильную картинку при определённых условиях.
Как проверить: сохраните эту картинку на своём сайте по такому же адресу, подмените айпишку с помощью /etc/hosts и запросите (уже со своего сайта).
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега PHP
♬♬
Может, файл качать cURL'ом? Я примерно так делаю:

$img = 'https://scontent.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/11378546_468565866637366_80199982_n.jpg';

$localFile = fopen( $_SERVER["DOCUMENT_ROOT"] . '/' . basename($img), 'w');
$ch = curl_init( $url);
curl_setopt_array( $ch, array(
    CURLOPT_FILE            => $localFile,
    CURLOPT_SSL_VERIFYPEER  => FALSE,
    CURLOPT_SSL_VERIFYHOST  => FALSE,
    CURLOPT_HEADER          => FALSE,
    CURLOPT_TIMEOUT         => 10,
));
curl_exec( $ch);
fclose( $localFile);
curl_close( $ch);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы