2011-12-13 104 views
0

发送这是我的控制器代码:浏览器不缓存响应由MediaView

$this->viewClass = 'Media'; 
    $params = array(
     'id'  => $filename '.gif', 
     'name'  => $filename , 
     'download' => false, 
     'extension' => 'gif', 
     'path'  => $folderpath, 
     'cache'  => '+30 days', 
     'modified' => '@' . filemtime($pathtofile), 

    ); 
    $this->set($params); 

和响应:

firebug screenshot http://i39.tinypic.com/es56di.png

调试在core.php中禁用。但是,浏览器(Firefox,Chrome)永远不会缓存该文件并始终下载整个文件。这是因为200 OK的回应?我该如何解决它?

编辑 我也许应该增加实际的请求URL

http://localhost/mycontroller/mymediaaction/2345

我由属性设置为动作参数,而不是实际的文件名,解决了这个问题的一个样本。对于这种行为的一些解释我仍然很感激。

+0

看起来像你最后修改的是一种无效(设置为0)。也许这会影响到它? – mark

+0

@TiCL我遇到了同样的问题。我的webroot中的图像的状态为“304未修改”。使用“媒体”视图流式传输的webroot外部图像的状态为“200 OK”,浏览器始终必须下载整个图像。你介意阐述你是如何解决这个问题的? – Nick

+0

没关系。只需要添加:if(isset($ _ SERVER ['HTTP_IF_MODIFIED_SINCE'])&& strtotime($ _ SERVER ['HTTP_IF_MODIFIED_SINCE'])== filemtime($ pathtofile)){header('HTTP/1.1 304 Not Modified') ;退出;}' – Nick

回答

0

控制器操作的以下代码片段将提供响应或文件。我认为checkNotModified功能应该由MediaView::render函数在内部完成,类似于AssetDispatcher。但暂时这个片段可能会有所帮助。

$modified = @filemtime(ROOT . $dir . $filename); 
$this->response->modified($modified); 
if ($this->response->checkNotModified($this->request)) 
{ 
    $this->autoRender = false; 
    $this->response->send(); 
} 
else 
{ 
    $this->viewClass = 'Media'; 
    $params = array('id' => $filename, 
     'cache' => '+1 day', 
     'modified' => '@' . $modified, // Must be a string to work. See MediaView->render() 
     'path' => ROOT . $dir); 
    $this->set($params); 
} 
return;