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