let browser cache images

This commit is contained in:
Ralf Becker 2014-03-06 15:10:22 +00:00
parent e2c8bb4425
commit 819fdea809
2 changed files with 28 additions and 7 deletions

View File

@ -681,7 +681,7 @@ class addressbook_bo extends addressbook_so
$data[$name] = egw_time::server2user($data[$name], $date_format); $data[$name] = egw_time::server2user($data[$name], $date_format);
} }
} }
$data['photo'] = $this->photo_src($data['id'],$data['jpegphoto']); $data['photo'] = $this->photo_src($data['id'],$data['jpegphoto'],'',$data['etag']);
// set freebusy_uri for accounts // set freebusy_uri for accounts
if (!$data['freebusy_uri'] && !$data['owner'] && $data['account_id'] && !is_object($GLOBALS['egw_setup'])) if (!$data['freebusy_uri'] && !$data['owner'] && $data['account_id'] && !is_object($GLOBALS['egw_setup']))
@ -701,14 +701,18 @@ class addressbook_bo extends addressbook_so
* @param int $id contact_id * @param int $id contact_id
* @param boolean $jpeg=false jpeg exists or not * @param boolean $jpeg=false jpeg exists or not
* @param string $default='' image-name to use if !$jpeg, eg. 'template' * @param string $default='' image-name to use if !$jpeg, eg. 'template'
* @param string $etag=null etag to set in url to allow caching with Expires header
* @return string/array * @return string/array
*/ */
function photo_src($id,$jpeg,$default='') function photo_src($id,$jpeg,$default='',$etag=null)
{ {
error_log(__METHOD__."($id, ..., etag=$etag) ". function_backtrace());
return $jpeg ? array( return $jpeg ? array(
'menuaction' => 'addressbook.addressbook_ui.photo', 'menuaction' => 'addressbook.addressbook_ui.photo',
'contact_id' => $id, 'contact_id' => $id,
) : $default; )+(isset($etag) ? array(
'etag' => $etag,
) : array()) : $default;
} }
/** /**

View File

@ -1982,7 +1982,7 @@ window.egw_LAB.wait(function() {
// Enable history // Enable history
$this->setup_history($content, $sel_options); $this->setup_history($content, $sel_options);
$content['photo'] = $this->photo_src($content['id'],$content['jpegphoto'],'photo'); $content['photo'] = $this->photo_src($content['id'],$content['jpegphoto'],'photo',$content['etag']);
if ($content['private']) $content['owner'] .= 'p'; if ($content['private']) $content['owner'] .= 'p';
@ -2392,12 +2392,29 @@ window.egw_LAB.wait(function() {
{ {
egw::redirect(common::image('addressbook','photo')); egw::redirect(common::image('addressbook','photo'));
} }
// use an etag over the image mapp
$etag = '"'.$contact['id'].':'.$contact['etag'].'"';
if (!ob_get_contents()) if (!ob_get_contents())
{ {
header('Content-type: image/jpeg'); header('Content-type: image/jpeg');
header('Content-length: '.(extension_loaded(mbstring) ? mb_strlen($contact['jpegphoto'],'ascii') : strlen($contact['jpegphoto']))); header('ETag: '.$etag);
echo $contact['jpegphoto']; // if etag parameter given in url, we can allow browser to cache picture via an Expires header
exit; // different url with different etag parameter will force a reload
if (isset($_GET['etag']))
{
egw_session::cache_control(30*86400); // cache for 30 days
}
// if servers send a If-None-Match header, response with 304 Not Modified, if etag matches
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] === $etag)
{
header("HTTP/1.1 304 Not Modified");
}
else
{
header('Content-length: '.bytes($contact['jpegphoto']));
echo $contact['jpegphoto'];
}
common::egw_exit();
} }
} }