Symfony 3.2 - HTTP 204 при отображении file_get_contents() для изображения, созданного с помощью imagejpeg()

Я создал изображение с помощью функции imagejpeg() в моем классе сущностей

    $imageSize = $this->_getDefaultImageSize();

    $image = imagecreate($imageSize['width'], $imageSize['height']);
    imagecolorallocate($image, 54, 175, 105);

    header('Content-type: image/jpeg');

    imagejpeg($image, $path, null);

    imagedestroy($image);

Сразу после этого я возвращаю file_get_contents($path) своему REST API Controller, который отображает его с соответствующим заголовком (например, "Content-type: image/jpeg") на основе расширения изображения, которое сохраняется в базе данных.

Если я отправляю сгенерированный файл, он дает мне заголовок 204, без содержимого. Если я зайду и переименую файл и добавлю новый файл изображения, загруженный из Google с тем же именем, что и раньше, он отправит это изображение с кодом 200. Удалите изображение Google, переименуйте сгенерированный файл в нормальное состояние и попробуйте получить его снова, он возвращает 204 снова.

Сначала я подумал, что это ошибка разрешения в Linux, я дал разрешение на сгенерированное изображение 664 так же, как изображение Google, и оно все еще не работало.

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

Любые мысли о том, почему изображение, сгенерированное imagejpeg() не будет отправлено на Symfony 3.2, используя PHP 7.2?

2 ответа

Решение

Для обслуживания файла из вашего приложения Symfony я предлагаю вам взглянуть на функцию file.

Эта функция должна быть доступна с вашего контроллера.

Эта функция принимает вначале параметр объект SplFileInfo или полный путь к файлу. Это добавляет хорошие заголовки и содержание файла к ответу.

Пример кода от контроллера

public function fileAction()
{
    // ....

    return $this->file($pathOrSplFileInfo, $fileNameForClientDownload);
}

Используйте этот код в вашем контроллере

<?php

     public function action()
     {
         $imageSize = $this->_getDefaultImageSize();

         $image = imagecreate($imageSize['width'], $imageSize['height']);
         imagecolorallocate($image, 54, 175, 105);

         $tmpName = tempnam(sys_get_temp_dir(), 'img') . '.jpg') 

         imagejpeg($image, $tmpName, null);

         $response = new \Symfony\Component\HttpFoundation\BinaryFileResponse($path)
                ->deleteFileAfterSend(true);

         return $response;
     }
Другие вопросы по тегам