note 117973 added to function.gzopen
| From: | dj8 at joesvolcano dot net | Date: | Fri, 11 Sep 2015 02:17:16 +0000 |
| Subject: | note 117973 added to function.gzopen | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-203767@lists.php.net to get a copy of this message | ||
An OO-version of David Gero's excellent GZ File format note also on this page:
<?php
// David Gero's example: read a file and output GZ
$gz_to_out = new GZTempFile(basename($file), "php://output");
$fin = fopen($file, "rb");
while($data = fread($fin, 64 * 1024)) {
$gz_to_out->fwrite();
}
close($fin);
$gz_to_out->flushBuffer();
// Example of building your GZ file content on the fly (temp filehandle)
$gz_custom = new GZTempFile();
foreach ( ... ) {
// Some work
$str = ...
$gz_custom->fwrite($str);
}
// Store it in a database
$m = new MongoClient();
$gridfs = $m->selectDB('test')->getGridFS();
$id = $gridfs->storeFile($gz_custom->getReadFilehandle(), array('contentType' =>
'application/x-gzip'));
class GZTempFile {
private $__fh = null;
public $uncompressed_bytes = 0;
public $filesize = null;
private $gz_filter = null;
private $file_hash = null;
private $final_read_fh = false;
private $__buffer = '';
private $__buffer_len = 0;
public function __construct($filename = 'data', $fh = null) {
$this->__fh = is_null($fh) ? fopen('php://temp','w+') : $fh;
fwrite($this->__fh, "\x1F\x8B\x08\x08".pack("V",
time())."\0\xFF", 10); // GZ file header
fwrite($this->__fh, str_replace("\0", "", basename($filename))
."\0"); // GZ filename = data, needed???
$this->gz_filter = stream_filter_append($this->__fh, "zlib.deflate",
STREAM_FILTER_WRITE, -1);
$this->uncompressed_bytes = 0;
$this->file_hash = hash_init("crc32b");
}
public function fwrite($str,$length = null) {
if ( $this->final_read_fh ) { throw new Exception("GZTempFile has already been finalized
and closed. No more writing"); }
hash_update($this->file_hash, $str);
$this->uncompressed_bytes += strlen($str);
$this->__buffer_len += strlen($str);
$this->__buffer .= $str;
if ( $this->__buffer_len >= 64 * 1024 ) { $this->flushBuffer(); }
}
public function flushBuffer() {
if ( $this->__buffer_len == 0 ) { return false; }
$return = fwrite($this->__fh, $this->__buffer);
$this->__buffer_len = 0;
$this->__buffer = '';
return $return;
}
public function getReadFilehandle() {
if ( ! $this->final_read_fh ) {
$this->flushBuffer();
stream_filter_remove($this->gz_filter);
$crc = hash_final($this->file_hash, TRUE); // hash_final is a string, not an
integer
fwrite($this->__fh, $crc[3].$crc[2].$crc[1].$crc[0]); // need to reverse the hash_final string
so it's little endian
fwrite($this->__fh, pack("V", $this->uncompressed_bytes), 4);
$this->filesize = ftell($this->__fh);
rewind($this->__fh);
$this->final_read_fh = $this->__fh;
}
return $this->final_read_fh;
}
}
----
Server IP: 72.52.91.14
Probable Submitter: 209.63.19.210
----
Manual Page -- http://php.net/manual/en/function.gzopen.php
Edit -- https://master.php.net/note/edit/117973
Del: integrated -- https://master.php.net/note/delete/117973/integrated
Del: useless -- https://master.php.net/note/delete/117973/useless
Del: bad code -- https://master.php.net/note/delete/117973/bad+code
Del: spam -- https://master.php.net/note/delete/117973/spam
Del: non-english -- https://master.php.net/note/delete/117973/non-english
Del: in docs -- https://master.php.net/note/delete/117973/in+docs
Del: other reasons-- https://master.php.net/note/delete/117973
Reject -- https://master.php.net/note/reject/117973
Search -- https://master.php.net/manage/user-notes.php