yii2:如何响应图像并让浏览器显示它?
yii2: how to response image and let browser show it?
同样的工作可以通过以下代码完成:
header('Content-Type:image/jpeg');
readfile('a.jpg');
但是现在我真的被Yii2的\yii\web\Response.
弄糊涂了
我的困惑是这样的:
创建控制器和动作以提供图片
见下文
class ServerController extends \yii\web\Controller
{
public function actionIndex($name)
{
// how to response
}
}
访问http://example.com/index.php?r=server/index&name=foo.jpg
感谢您的回答!
我是这样做的。我添加了另一个函数来设置 headers。您也可以在助手中移动此功能:
$this->setHttpHeaders('csv', 'filename', 'text/plain');
/**
* Sets the HTTP headers needed by file download action.
*/
protected function setHttpHeaders($type, $name, $mime, $encoding = 'utf-8')
{
Yii::$app->response->format = Response::FORMAT_RAW;
if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE") == false) {
header("Cache-Control: no-cache");
header("Pragma: no-cache");
} else {
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
}
header("Expires: Sat, 26 Jul 1979 05:00:00 GMT");
header("Content-Encoding: {$encoding}");
header("Content-Type: {$mime}; charset={$encoding}");
header("Content-Disposition: attachment; filename={$name}.{$type}");
header("Cache-Control: max-age=0");
}
我也找到了yii2是怎么做的,看这里(滚动到底部)https://github.com/yiisoft/yii2/blob/48ec791e4aca792435ef1fdce80ee7f6ef365c5c/framework/captcha/CaptchaAction.php
最后,我按照代码完成了:
$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();
Yii2 方式:
Yii::$app->response->setDownloadHeaders($filename);
在 yii2 中,您可以 return 来自 class yii\web\Response 的响应 object 在行动中。这样您就可以 return 自己的回复。
例如在yii2中显示图片:
public function actionIndex() {
\Yii::$app->response->format = yii\web\Response::FORMAT_RAW;
\Yii::$app->response->headers->add('content-type','image/png');
\Yii::$app->response->data = file_get_contents('file.png');
return \Yii::$app->response;
}
FORMAT_RAW:数据将被视为响应内容,不做任何转换。不会添加额外的 HTTP header。
Yii2 已经为 sending files 提供了 built-in 功能。这样你就不需要设置响应格式,内容类型将被自动检测(如果你愿意,你可以覆盖它):
function actionDownload()
{
$imgFullPath = 'picture.jpg';
return Yii::$app->response->sendFile($imgFullPath);
}
..
如果文件只是为当前下载操作临时创建的,您可以使用 AFTER_SEND
事件删除文件:
function actionDownload()
{
$imgFullPath = 'picture.jpg';
return Yii::$app->response
->sendFile($imgFullPath)
->on(\yii\web\Response::EVENT_AFTER_SEND, function($event) {
unlink($event->data);
}, $imgFullPath);
}
同样的工作可以通过以下代码完成:
header('Content-Type:image/jpeg');
readfile('a.jpg');
但是现在我真的被Yii2的\yii\web\Response.
我的困惑是这样的:
创建控制器和动作以提供图片
见下文
class ServerController extends \yii\web\Controller { public function actionIndex($name) { // how to response } }
访问
http://example.com/index.php?r=server/index&name=foo.jpg
感谢您的回答!
我是这样做的。我添加了另一个函数来设置 headers。您也可以在助手中移动此功能:
$this->setHttpHeaders('csv', 'filename', 'text/plain');
/**
* Sets the HTTP headers needed by file download action.
*/
protected function setHttpHeaders($type, $name, $mime, $encoding = 'utf-8')
{
Yii::$app->response->format = Response::FORMAT_RAW;
if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE") == false) {
header("Cache-Control: no-cache");
header("Pragma: no-cache");
} else {
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
}
header("Expires: Sat, 26 Jul 1979 05:00:00 GMT");
header("Content-Encoding: {$encoding}");
header("Content-Type: {$mime}; charset={$encoding}");
header("Content-Disposition: attachment; filename={$name}.{$type}");
header("Cache-Control: max-age=0");
}
我也找到了yii2是怎么做的,看这里(滚动到底部)https://github.com/yiisoft/yii2/blob/48ec791e4aca792435ef1fdce80ee7f6ef365c5c/framework/captcha/CaptchaAction.php
最后,我按照代码完成了:
$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();
Yii2 方式:
Yii::$app->response->setDownloadHeaders($filename);
在 yii2 中,您可以 return 来自 class yii\web\Response 的响应 object 在行动中。这样您就可以 return 自己的回复。
例如在yii2中显示图片:
public function actionIndex() {
\Yii::$app->response->format = yii\web\Response::FORMAT_RAW;
\Yii::$app->response->headers->add('content-type','image/png');
\Yii::$app->response->data = file_get_contents('file.png');
return \Yii::$app->response;
}
FORMAT_RAW:数据将被视为响应内容,不做任何转换。不会添加额外的 HTTP header。
Yii2 已经为 sending files 提供了 built-in 功能。这样你就不需要设置响应格式,内容类型将被自动检测(如果你愿意,你可以覆盖它):
function actionDownload()
{
$imgFullPath = 'picture.jpg';
return Yii::$app->response->sendFile($imgFullPath);
}
..
如果文件只是为当前下载操作临时创建的,您可以使用 AFTER_SEND
事件删除文件:
function actionDownload()
{
$imgFullPath = 'picture.jpg';
return Yii::$app->response
->sendFile($imgFullPath)
->on(\yii\web\Response::EVENT_AFTER_SEND, function($event) {
unlink($event->data);
}, $imgFullPath);
}