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

Я создал изображение с помощью функции 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 ]

0 голосов
/ 28 августа 2018

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

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

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

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

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

    return $this->file($pathOrSplFileInfo, $fileNameForClientDownload);
}
0 голосов
/ 28 августа 2018

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

<?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;
     }
...