jusitnm Posted March 27, 2007 Share Posted March 27, 2007 Alright, I found a PHP Zip on the fly script that I modded a little. I want this to be able to zip up two files which are in the same folder, no biggy. The only problem that I have found is that the memory_limit defined in phpinfo is limited to 40 MB. I want this to be able to zip a movie (400 MB) and a readme text document (20 KB) Of course I get the following error when I try to download the zip file of both the files in the zip. Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 416558280 bytes) in /home/username/public_html/downloads.php on line 14 memory_limit is set to 40 MB by my host I was wondering, is there a way to go about doing this in multiple stages, in order to get the same job done? <?PHP // Connect to the Database include($_SERVER["DOCUMENT_ROOT"]."/global/config.php"); // Hides my errors from users error_reporting(0); // Pull infromation from my MySQL DB $section = $_GET[section]; $downloads = mysql_query("select * from $section WHERE id = $_GET[fileid]"); while($dl=mysql_fetch_array($downloads)) { extract($dl); require ("incl/zipfile.inc.php"); // Grab zip functions $zipfile = new zipfile(); $filedata1 = implode("", file("$section/$name/$file_name")); $filedata2 = implode("", file("$section/$name/readme.txt")); $zipfile->add_dir("$sub/"); $zipfile->add_file($filedata1, $name."/".$file_name); $zipfile->add_file($filedata2, $name."/readme.txt"); header("Content-type: application/zip"); header("Content-disposition: attachment; filename=$name.zip"); header("Content-Length: $file_size); echo $zipfile->file(); } ?> <?php /* Zip file creation class makes zip files on the fly... use the functions add_dir() and add_file() to build the zip file; see example code below by Eric Mueller http://www.themepark.com v1.1 9-20-01 - added comments to example v1.0 2-5-01 initial version with: - class appearance - add_file() and file() methods - gzcompress() output hacking by Denis O.Philippov, [email protected], http://www.atlant.ru */ // official ZIP file format: http://www.pkware.com/appnote.txt class zipfile { var $datasec = array(); // array to store compressed data var $ctrl_dir = array(); // central directory var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record var $old_offset = 0; function add_dir($name) // adds "directory" to archive - do this before putting any files in directory! // $name - name of directory... like this: "path/" // ...then you can add files using add_file with names like "path/file.txt" { $name = str_replace("\\", "/", $name); $fr = "\x50\x4b\x03\x04"; $fr .= "\x0a\x00"; // ver needed to extract $fr .= "\x00\x00"; // gen purpose bit flag $fr .= "\x00\x00"; // compression method $fr .= "\x00\x00\x00\x00"; // last mod time and date $fr .= pack("V",0); // crc32 $fr .= pack("V",0); //compressed filesize $fr .= pack("V",0); //uncompressed filesize $fr .= pack("v", strlen($name) ); //length of pathname $fr .= pack("v", 0 ); //extra field length $fr .= $name; // end of "local file header" segment // no "file data" segment for path // "data descriptor" segment (optional but necessary if archive is not served as file) $fr .= pack("V",$crc); //crc32 $fr .= pack("V",$c_len); //compressed filesize $fr .= pack("V",$unc_len); //uncompressed filesize // add this entry to array $this -> datasec[] = $fr; $new_offset = strlen(implode("", $this->datasec)); // ext. file attributes mirrors MS-DOS directory attr byte, detailed // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp // now add to central record $cdrec = "\x50\x4b\x01\x02"; $cdrec .="\x00\x00"; // version made by $cdrec .="\x0a\x00"; // version needed to extract $cdrec .="\x00\x00"; // gen purpose bit flag $cdrec .="\x00\x00"; // compression method $cdrec .="\x00\x00\x00\x00"; // last mod time & date $cdrec .= pack("V",0); // crc32 $cdrec .= pack("V",0); //compressed filesize $cdrec .= pack("V",0); //uncompressed filesize $cdrec .= pack("v", strlen($name) ); //length of filename $cdrec .= pack("v", 0 ); //extra field length $cdrec .= pack("v", 0 ); //file comment length $cdrec .= pack("v", 0 ); //disk number start $cdrec .= pack("v", 0 ); //internal file attributes $ext = "\x00\x00\x10\x00"; $ext = "\xff\xff\xff\xff"; $cdrec .= pack("V", 16 ); //external file attributes - 'directory' bit set $cdrec .= pack("V", $this -> old_offset ); //relative offset of local header $this -> old_offset = $new_offset; $cdrec .= $name; // optional extra field, file comment goes here // save to array $this -> ctrl_dir[] = $cdrec; } function add_file($data, $name) // adds "file" to archive // $data - file contents // $name - name of file in archive. Add path if your want { $name = str_replace("\\", "/", $name); //$name = str_replace("\\", "\\\\", $name); $fr = "\x50\x4b\x03\x04"; $fr .= "\x14\x00"; // ver needed to extract $fr .= "\x00\x00"; // gen purpose bit flag $fr .= "\x08\x00"; // compression method $fr .= "\x00\x00\x00\x00"; // last mod time and date $unc_len = strlen($data); $crc = crc32($data); $zdata = gzcompress($data); $zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug $c_len = strlen($zdata); $fr .= pack("V",$crc); // crc32 $fr .= pack("V",$c_len); //compressed filesize $fr .= pack("V",$unc_len); //uncompressed filesize $fr .= pack("v", strlen($name) ); //length of filename $fr .= pack("v", 0 ); //extra field length $fr .= $name; // end of "local file header" segment // "file data" segment $fr .= $zdata; // "data descriptor" segment (optional but necessary if archive is not served as file) $fr .= pack("V",$crc); //crc32 $fr .= pack("V",$c_len); //compressed filesize $fr .= pack("V",$unc_len); //uncompressed filesize // add this entry to array $this -> datasec[] = $fr; $new_offset = strlen(implode("", $this->datasec)); // now add to central directory record $cdrec = "\x50\x4b\x01\x02"; $cdrec .="\x00\x00"; // version made by $cdrec .="\x14\x00"; // version needed to extract $cdrec .="\x00\x00"; // gen purpose bit flag $cdrec .="\x08\x00"; // compression method $cdrec .="\x00\x00\x00\x00"; // last mod time & date $cdrec .= pack("V",$crc); // crc32 $cdrec .= pack("V",$c_len); //compressed filesize $cdrec .= pack("V",$unc_len); //uncompressed filesize $cdrec .= pack("v", strlen($name) ); //length of filename $cdrec .= pack("v", 0 ); //extra field length $cdrec .= pack("v", 0 ); //file comment length $cdrec .= pack("v", 0 ); //disk number start $cdrec .= pack("v", 0 ); //internal file attributes $cdrec .= pack("V", 32 ); //external file attributes - 'archive' bit set $cdrec .= pack("V", $this -> old_offset ); //relative offset of local header // echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>"; $this -> old_offset = $new_offset; $cdrec .= $name; // optional extra field, file comment goes here // save to central directory $this -> ctrl_dir[] = $cdrec; } function file() { // dump out file $data = implode("", $this -> datasec); $ctrldir = implode("", $this -> ctrl_dir); return $data. $ctrldir. $this -> eof_ctrl_dir. pack("v", sizeof($this -> ctrl_dir)). // total # of entries "on this disk" pack("v", sizeof($this -> ctrl_dir)). // total # of entries overall pack("V", strlen($ctrldir)). // size of central dir pack("V", strlen($data)). // offset to start of central dir "\x00\x00"; // .zip file comment length } } ?> Link to comment https://forums.phpfreaks.com/topic/44557-php-zip-files/ Share on other sites More sharing options...
per1os Posted March 27, 2007 Share Posted March 27, 2007 I do not think there is. You may consider using the exec(); function and zipping it up using the server's command line and than just linking to that newly created file? Link to comment https://forums.phpfreaks.com/topic/44557-php-zip-files/#findComment-216421 Share on other sites More sharing options...
jusitnm Posted March 27, 2007 Author Share Posted March 27, 2007 If I do that, wouldn't it create the files twice? One non zipped and one zipped? The reason I am doing it this way is because I want to still be able to stream the video's to Premium Members and to be able to download the movie if your not premium (which is why I want the two files zipped) Also, If I use the following command, would this override the hosts settings or does php go by the Master Setting? ini_set("memory_limit", "600M"); Link to comment https://forums.phpfreaks.com/topic/44557-php-zip-files/#findComment-216437 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.