Symfony 3.2 - 为使用 imagejpeg() 创建的图像回显 file_get_contents() 时的 HTTP 204

Symfony 3.2 - HTTP 204 when echoing file_get_contents() for an image created with imagejpeg()

我在我的实体中使用 imagejpeg() 函数创建了一个图像 class

    $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);

在此之后,我立即 return file_get_contents($path) 到我的 REST API 控制器,它与相应的 header 相呼应(例如 'Content-type: image/jpeg' ) 基于保存在数据库中的图像扩展名。

如果我发送生成的文件,它会给我一个 204 header,没有内容。如果我进入并重命名文件并添加从 google 下载的新图像文件,名称与之前相同,它将发送代码为 200 的图像。删除 google 图像,重命名生成的图像文件恢复正常并尝试再次获取它,它再次 returns 204。

一开始以为是Linux中的权限错误,我跟google图片一样给生成的图片664权限,还是不行。

我还必须补充一点,图像生成正确,可以通过服务器上的 public 目录和任何图像查看应用程序查看。

关于为什么 imagejpeg() 生成的图像无法在使用 PHP 7.2 的 Symfony 3.2 上发送的任何想法?

在您的控制器中使用此代码

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

要从您的 symfony 应用程序提供文件,我建议您看一下 file function

您的控制器应该可以使用此功能。

此函数首先采用参数 a SplFileInfo object 或文件的完整路径。它将好的 headers 和文件内容添加到响应中。

来自控制器的示例代码

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

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