2015-01-06 6 views
5

taka sama praca może być wykonywana przez kod obserwacji:yii2: jak wyświetlić obraz odpowiedzi i pozwolić przeglądarce?

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

ale teraz naprawdę zdezorientowany Yii2 za \ yii \ web \ Response.


Co ja mylony jest tak:

  1. utworzyć kontroler i działania, aby zapewnić obrazowi

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

  1. dostęp http://example.com/index.php?r=server/index&name=foo.jpg

dzięki za odpowiedź!

+0

Proszę wyjaśnić, co jest dokładnie Twoim problemem. – soju

Odpowiedz

1

Robię to w ten sposób. Dodałem kolejną funkcję tylko do ustawiania nagłówków. Można przenieść tę funkcję w pomocnika też:

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

Znalazłem też jak yii2 to, spójrz tutaj (przewiń do dołu) https://github.com/yiisoft/yii2/blob/48ec791e4aca792435ef1fdce80ee7f6ef365c5c/framework/captcha/CaptchaAction.php

11

Wreszcie zrobiłem to za pomocą kodów follow:

$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

Próbowałem Twojego rozwiązania. Wydaje się działać! Czyż zasób nie zostanie jakoś zamknięty? – robsch

+0

Nie mam pojęcia o zamknięciu połączenia zasobów. Czy możesz mi powiedzieć, jak już to znalazłeś? – haoliang

+1

Zwykle należy wywoływać funkcję fclose() w celu zwolnienia zasobu. Ale myślę, że dzieje się to automatycznie (http://stackoverflow.com/questions/12143343/does-php-close-the-file-after-the-file-handler-is-garbage-collected). Więc wydaje się, że twoje rozwiązanie jest w porządku. – robsch

2

Yii2 sposób:

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

dzięki za odpowiedź! ale wydaje się, że nie podążyłeś za moim pytaniem. – haoliang

4

w yii2 można powrócić do obiektu odpowiedzi fr om klasa yii\web\Response w akcji. więc możesz zwrócić własną odpowiedź.

na przykład wyświetlany obraz 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: dane będą traktowane jako odpowiedź treści bez konwersji. Żaden dodatkowy nagłówek HTTP nie zostanie dodany.

Powiązane problemy