2015-01-06 39 views
5

công việc tương tự có thể được thực hiện theo mã sau:yii2: cách phản hồi hình ảnh và cho phép trình duyệt hiển thị hình ảnh?

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

nhưng bây giờ tôi thực sự bối rối bởi Yii2 của \ yii \ web \ đáp ứng.


Những gì tôi bối rối là như thế:

  1. tạo một bộ điều khiển và hành động để cung cấp hình ảnh

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

  1. truy cập http://example.com/index.php?r=server/index&name=foo.jpg

cảm ơn bạn đã trả lời!

+0

Hãy giải thích chính xác vấn đề của bạn là gì – soju

Trả lời

1

Tôi làm như thế này. Tôi đã thêm một chức năng khác chỉ để thiết lập các tiêu đề. Bạn có thể di chuyển chức năng này trong một helper quá:

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

Tôi cũng thấy như thế nào yii2 nó, hãy xem ở đây (cuộn xuống phía dưới) https://github.com/yiisoft/yii2/blob/48ec791e4aca792435ef1fdce80ee7f6ef365c5c/framework/captcha/CaptchaAction.php

11

Cuối cùng, tôi đã làm nó bằng mã sau:

$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

Tôi đã thử giải pháp của bạn. Dường như làm việc! Shoudn't các nguồn lực được đóng cửa bằng cách nào đó? – robsch

+0

Tôi không có ý tưởng về việc đóng kết nối tài nguyên. Bạn có thể cho tôi biết cách nếu bạn đã tìm thấy nó? – haoliang

+1

Thông thường, ta nên gọi fclose() để giải phóng tài nguyên. Nhưng tôi nghĩ rằng điều này được thực hiện tự động (http://stackoverflow.com/questions/12143343/does-php-close-the-file-after-the-file-handler-is-garbage-collected). Vì vậy, giải pháp của bạn dường như không sao, tôi đoán vậy. – robsch

2

cách Yii2:

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

cảm ơn bạn đã trả lời! nhưng có vẻ như bạn đã không làm theo câu hỏi của tôi. – haoliang

4

trong yii2 bạn có thể trả về một đối tượng response fr om class yii\web\Response đang hoạt động. để bạn có thể trả lời riêng.

ví dụ hình ảnh trưng bày tại 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: dữ liệu sẽ được coi là nội dung câu trả lời mà không cần bất kỳ chuyển đổi. Không thêm tiêu đề HTTP bổ sung nào.

Các vấn đề liên quan