diff options
author | redmatrix <git@macgirvin.com> | 2016-06-29 17:31:48 -0700 |
---|---|---|
committer | redmatrix <git@macgirvin.com> | 2016-06-29 17:31:48 -0700 |
commit | 2e93a09d83f16f12796ff4edc1aca09339ae2ccf (patch) | |
tree | 3032841e4c6ff960b7cb559a1e7db87fecc5cfc8 /Zotlabs/Module | |
parent | 05aba0b4dd9ce5798e2c8bb57900b03ae96a233e (diff) | |
download | volse-hubzilla-2e93a09d83f16f12796ff4edc1aca09339ae2ccf.tar.gz volse-hubzilla-2e93a09d83f16f12796ff4edc1aca09339ae2ccf.tar.bz2 volse-hubzilla-2e93a09d83f16f12796ff4edc1aca09339ae2ccf.zip |
stream large photos through buffered I/O if possible
Diffstat (limited to 'Zotlabs/Module')
-rw-r--r-- | Zotlabs/Module/Photo.php | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php index 5148c4a94..66aaec49f 100644 --- a/Zotlabs/Module/Photo.php +++ b/Zotlabs/Module/Photo.php @@ -2,6 +2,7 @@ namespace Zotlabs\Module; require_once('include/security.php'); +require_once('include/attach.php'); require_once('include/photo/photo_driver.php'); @@ -10,6 +11,8 @@ class Photo extends \Zotlabs\Web\Controller { function init() { $prvcachecontrol = false; + $streaming = null; + $channel = null; switch(argc()) { case 4: @@ -131,6 +134,8 @@ class Photo extends \Zotlabs\Web\Controller { $sql_extra = permissions_sql($r[0]['uid']); + $channel = channelx_by_n($r[0]['uid']); + // Now we'll see if we can access the photo $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d $sql_extra LIMIT 1", @@ -141,8 +146,9 @@ class Photo extends \Zotlabs\Web\Controller { if($r && $allowed) { $data = dbunescbin($r[0]['content']); $mimetype = $r[0]['mimetype']; - if(intval($r[0]['os_storage'])) - $data = file_get_contents($data); + if(intval($r[0]['os_storage'])) { + $streaming = $data; + } } else { @@ -242,7 +248,25 @@ class Photo extends \Zotlabs\Web\Controller { header("Cache-Control: max-age=" . $cache); } - echo $data; + + // If it's a file resource, stream it. + + if($streaming && $channel) { + if(strpos($streaming,'store') !== false) + $istream = fopen($streaming,'rb'); + else + $istream = fopen('store/' . $channel['channel_address'] . '/' . $streaming,'rb'); + $ostream = fopen('php://output','wb'); + if($istream && $ostream) { + pipe_streams($istream,$ostream); + fclose($istream); + fclose($ostream); + } + } + else { + echo $data; + } + killme(); // NOTREACHED } |