Yii 2: 怎样才能返回图片并让浏览器显示出来?

同样的事情 可以用以下代码实现:

header('Content-Type:image/jpeg');
readfile('a.jpg');

但我真的被 Yii 2 的 Response 弄晕了。

写完题目,想起 Yii 2 中的验证码那块是否可以借鉴一下。

谢谢!

阅读 10.9k
3 个回答

通过以下文档的各种属性,可以看到如何实现你说的例子一样的功能
http://www.yiiframework.com/doc-2.0/yii-web-response.html
首先是 $acceptMimeType 属性,就是设置header
或者通过
$headers 属性,批量设置 header
然后你需要把图片发出去,意味着数据需要使用二进制流的形式发出去。
那么就可以通过设置
$data 属性来做到。因为他是 mixed 类型
$content 属性就不行。因为他是 string 类型
并且
$content 的属性也说明了,仅在 $data 属性没有设置的情况下才会使用
最后发现了一个属性
$format
根据文档的解释为:response的数据格式,用于转换$data或者$content的数据格式。
下面有一些选项。
通常要直接显示为图片都是使用 RAW 格式,即“未经加工”过的数据。
那么通过上面这些属性就能达到你的目的。

最后说一句,如果你要的是使用简单便捷,那么使用这种方案会让你痛苦。但是如果你想要的是管理简单便捷。那么使用框架的属性、方法去做到这些,当然是更加的舒服。

为啥要这样实现呢?应用场景是啥?我还是觉得返回图片的路径就足矣

同样的问题, 在 stackoverflow的回答

受 @湿湿 的启发, 我的实际代码

    public function actionIndex($img = false)
    {/*{{{*/

        $imgFullPath = Yii::getAlias('@webroot').'/'.Yii::$app->params['uploadDir'].'/'.$img;

        if (!$img || !file_exists($imgFullPath))
            throw new NotFoundHttpException('requested page not exists.');

        $response = Yii::$app->getResponse();
        $response->headers->set('Content-Type', 'image/jpeg');
        $response->format = Response::FORMAT_RAW;
        if ( !is_resource($response->stream = fopen($imgFullPath, 'r')) )
            throw new \yii\web\ServerErrorHttpException('file access failed: permission deny');
        return $response->send();

    }/*}}}*/

宣传栏