2015-01-06 80 views
5

同樣的工作可以通過如下代碼來完成:yii2:如何響應圖像並讓瀏覽器顯示它?

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

,但現在我真的Yii2的\警予\網絡\響應混淆。


我混淆就是這樣:

  1. 創建一個控制器和動作,以提供圖象

class ServerController extends \yii\web\Controller { public function actionIndex($name) { // how to response } }

  • 訪問http://example.com/index.php?r=server/index&name=foo.jpg
  • 感謝您的回答!

    +0

    請解釋一下你的問題 – soju

    回答

    1

    我這樣做。我添加了另一個功能只是爲了設置標題。您可以在幫助推動這一功能太:

    $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

    11

    最後,我做到了通過如下代碼:

    $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(); 
    
    +0

    我試過你的解決方案。似乎工作!不知何故資源被關閉? – robsch

    +0

    我不知道關閉資源連接。如果你已經找到它,你能告訴我方式嗎? – haoliang

    +1

    通常,應該調用fclose()來釋放資源。但我認爲這是自動完成的(http://stackoverflow.com/questions/12143343/does-php-close-the-file-after-the-file-handler-is-garbage-collected)。所以你的解決方案似乎沒問題,我想。 – robsch

    2

    的yii2方式:

    Yii::$app->response->setDownloadHeaders($filename); 
    
    +0

    謝謝你的回答!但似乎你沒有按照我的問題。 – haoliang

    4

    在yii2你可以返回一個響應對象FR om class yii\web\Response正在實施中。所以你可以返回自己的回覆。在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標題將被添加。

    相關問題