我把数据库中的文件循环读到一个数组中了,怎么把这些文件打成压缩包下载下来呢?
 for($i = 0; $i < count($file); $i++)
  {
  $sqlstr ="select * from LINE where LINE_ID = '".$file[$i]."'";
  $parsed = oci_parse($f_conn, $sqlstr);
  oci_execute($parsed) or die ("Unable to execute query\n");
  if(OCIFetchinto($parsed,$row,OCI_ASSOC+OCI_RETURN_LOBS))
  {
   continue;
  }
oci_free_statement($parsed);
  }
$row数组包括i个文件,如何把其中的文件打成一个压缩包下载下来呢?

解决方案 »

  1.   

    header('Content-Disposition: attachment; filename=$row[$i]');
      

  2.   

    忘了,应该先用Zip打包文件,类似下面的
    <?php
    $zip = new ZipArchive;
    if ($zip->open('test.zip') === TRUE) {
        $zip->addFile('/path/to/index.txt', 'newname.txt');
        $zip->close();
        echo 'ok';
    } else {
        echo 'failed';
    }
    ?>
      

  3.   

    问题已解决,谢谢博友们的帮助!
      if(OCIFetchinto($parsed,$row,OCI_ASSOC+OCI_RETURN_LOBS))
      {
      continue;
      }
    把这句里面的$row改成$row[$i],即把获取的数据库的BLOB字段顺序赋值给数组。
    <?php
    require_once "zip.php"; // zip路径在php.ini中配置,具体请上网查阅
    $curtempdir = '../testfolder';
    @mkdir($curtempdir); //创建虚拟目录
    if (file_exists($curtempdir)) { 
    deldir($curtempdir); //删除旧的文件夹 及其下的文件
    }
    if (sizeof($tempfile) > 0) { 
    mkdir($curtempdir, 0777); //如果有要打包的文件,重新创建文件夹 
    }
    if (sizeof($tempfile) > 0) { 
    for($j = 0; $j < $total; $j++){//for循环的目的是把上述数组中的blob字段写入不同的文件,文件名为变量:$row[$j]['file_name']
    $fp=fopen("$curtempdir/".$row[$j]['FILE_NAME'],'w+');
    fwrite($fp,$row[$j]['FILE']);
    }
    }
    $zip = new PHPZip();
    $zip -> createZip($curtempdir, "file_".date('Ymd').".zip",true); //打包并下载虚拟目录中的所有文件
    oci_close($f_conn);
    }
    }
    ?>
    zip.php 文件如下
    <?php
    /*
    File name: /include/zip.php
    Author: Horace     2009/04/15
     */
    class PHPZip{
    var $dirInfo = array("0","0");
    var $rootDir = '';
    var $datasec      = array();
    var $ctrl_dir     = array();
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
    var $old_offset   = 0; function downloadZip(){
    createZip($dir, $zipfilename, true);
    }
    function createZip($dir, $zipfilename, $autoDownload = false){
    if (@function_exists('gzcompress')){
    @set_time_limit("0");
    if (is_array($dir)){
    $fd = fopen ($dir, "r");
    $fileValue = fread ($fd, filesize ($filename));
    fclose ($fd);
    if (is_array($dir)) $filename = basename($dir);
    $this -> addFile($fileValue, "$filename");
    }else{
    $this->dirTree($dir,$dir);
    } $zipfilenametemp = time().$zipfilename;
    $out = $this -> filezip();
    $fp = fopen($zipfilenametemp, "w");
    fwrite($fp, $out, strlen($out));
    fclose($fp);
    $filesize = filesize($zipfilenametemp); if ($filesize < 104857600) {
    if($autoDownload){
    header("Content-type: application/octet-stream");
    header("Content-disposition: attachment; filename=".$zipfilename);
    }
    echo $this -> filezip();
    }else{
    echo "create zip error!";
    }
    unlink($zipfilenametemp);
    }
     }
    //get dir tree..
    function dirTree($directory,$rootDir){
    global $_SERVER,$dirInfo,$rootDir; $fileDir=$rootDir;
    $myDir=dir($directory);
    while($file=$myDir->read()){
    if(is_dir("$directory/$file") and $file!="." and $file!=".."){
    $dirInfo[0]++;
    $rootDir ="$fileDir$file/"; $this -> addFile('', "$rootDir"); //go on n's folders
    $this->dirTree("$directory/$file",$rootDir);
    }else{
    if($file!="." and $file!=".."){
    $dirInfo[1]++;
    //$fd = fopen ("$directory/$file", "r");
    $fileValue = file_get_contents("$directory/$file");
    //fclose ($fd);
    $this -> addFile($fileValue, "$fileDir$file");
    }
    }
    }
    $myDir->close();
    }
        function unix2DosTime($unixtime = 0) {
            $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);        if ($timearray['year'] < 1980) {
             $timearray['year']    = 1980;
             $timearray['mon']     = 1;
             $timearray['mday']    = 1;
             $timearray['hours']   = 0;
             $timearray['minutes'] = 0;
             $timearray['seconds'] = 0;
            } // end if        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                    ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
        }
        function addFile($data, $name, $time = 0){
            $name     = str_replace('\\', '/', $name);        $dtime    = dechex($this->unix2DosTime($time));
            $hexdtime = '\x' . $dtime[6] . $dtime[7]
                      . '\x' . $dtime[4] . $dtime[5]
                      . '\x' . $dtime[2] . $dtime[3]
                      . '\x' . $dtime[0] . $dtime[1];
            eval('$hexdtime = "' . $hexdtime . '";');        $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   .= $hexdtime;             // last mod time and date        // "local file header" segment
            $unc_len = strlen($data);
            $crc     = crc32($data);
            $zdata   = gzcompress($data);
            $c_len   = strlen($zdata);
            $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
            $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;        // "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 .= $hexdtime;                 // 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
            $this -> old_offset = $new_offset;        $cdrec .= $name;        // optional extra field, file comment goes here
            // save to central directory
            $this -> ctrl_dir[] = $cdrec;
        }
        function filezip(){
            $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
        }
    }
    function deldir($dir){ 
        delfile($dir); 
        if (is_dir($dir)) {
          rmdir($dir);//目录必须是空的 
        }
    }
    function delfile($dir) {
        if (is_dir($dir)) {
           $dh=opendir($dir);//打开目录  //列出目录中的所有文件并去掉 . 和 ..  
           while (false !== ( $files = readdir ($dh))) {    
              if($files!="." && $files!="..") {
                $fullpath=$dir."/".$files;     
                if(!is_dir($fullpath)) {
                  unlink($fullpath);//删除目录中的所有文件    
                 }
                 else { 
                  delfile($fullpath);    
                 }
                 }
             }
             closedir($dh);  
             }
    }
    ?>