注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

php压缩下载文件处理  

2007-08-17 15:17:07|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://phpclasses.dev.skypp.com/browse/package/2322.html

类文件:createZip.inc.php

<?php

/**
* Class to dynamically create a zip file (archive)
*
* @author Rochak Chauhan
*/

class createZip  
{  

    
public $compressedData
= array();
    
public $centralDirectory = array();
// central directory   
    
public $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00";
//end of Central directory record
    
public $oldOffset = 0
;

    
/**
     * Function to create the directory where the file(s) will be unzipped
     *
     * @param $directoryName string
     *
     */
    
    
public function addDirectory($directoryName
) {
        
$directoryName = str_replace("\\", "/", $directoryName
);  

        
$feedArrayRow = "\x50\x4b\x03\x04"
;
        
$feedArrayRow .= "\x0a\x00"
;    
        
$feedArrayRow .= "\x00\x00"
;    
        
$feedArrayRow .= "\x00\x00"
;    
        
$feedArrayRow .= "\x00\x00\x00\x00"
;

        
$feedArrayRow .= pack("V",0
);
        
$feedArrayRow .= pack("V",0
);
        
$feedArrayRow .= pack("V",0
);
        
$feedArrayRow .= pack("v", strlen($directoryName
) );
        
$feedArrayRow .= pack("v", 0
);
        
$feedArrayRow .= $directoryName
;  

        
$feedArrayRow .= pack("V",0
);
        
$feedArrayRow .= pack("V",0
);
        
$feedArrayRow .= pack("V",0
);

        
$this -> compressedData[] = $feedArrayRow
;
        
        
$newOffset = strlen(implode("", $this->compressedData
));

        
$addCentralRecord = "\x50\x4b\x01\x02"
;
        
$addCentralRecord .="\x00\x00"
;    
        
$addCentralRecord .="\x0a\x00"
;    
        
$addCentralRecord .="\x00\x00"
;    
        
$addCentralRecord .="\x00\x00"
;    
        
$addCentralRecord .="\x00\x00\x00\x00"
;
        
$addCentralRecord .= pack("V",0
);
        
$addCentralRecord .= pack("V",0
);
        
$addCentralRecord .= pack("V",0
);
        
$addCentralRecord .= pack("v", strlen($directoryName
) );
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("v", 0
);
        
$ext = "\x00\x00\x10\x00"
;
        
$ext = "\xff\xff\xff\xff"
;  
        
$addCentralRecord .= pack("V", 16
);

        
$addCentralRecord .= pack("V", $this -> oldOffset
);
        
$this -> oldOffset = $newOffset
;

        
$addCentralRecord .= $directoryName
;  

        
$this -> centralDirectory[] = $addCentralRecord
;  
    }    
    
    
/**
     * Function to add file(s) to the specified directory in the archive
     *
     * @param $directoryName string
     *
     */
    
    
public function addFile($data, $directoryName
)   {

        
$directoryName = str_replace("\\", "/", $directoryName
);  
    
        
$feedArrayRow = "\x50\x4b\x03\x04"
;
        
$feedArrayRow .= "\x14\x00"
;    
        
$feedArrayRow .= "\x00\x00"
;    
        
$feedArrayRow .= "\x08\x00"
;    
        
$feedArrayRow .= "\x00\x00\x00\x00"
;

        
$uncompressedLength = strlen($data
);  
        
$compression = crc32($data
);  
        
$gzCompressedData = gzcompress($data
);  
        
$gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2
);
        
$compressedLength = strlen($gzCompressedData
);  
        
$feedArrayRow .= pack("V",$compression
);
        
$feedArrayRow .= pack("V",$compressedLength
);
        
$feedArrayRow .= pack("V",$uncompressedLength
);
        
$feedArrayRow .= pack("v", strlen($directoryName
) );
        
$feedArrayRow .= pack("v", 0
);
        
$feedArrayRow .= $directoryName
;  

        
$feedArrayRow .= $gzCompressedData
;  

        
$feedArrayRow .= pack("V",$compression
);
        
$feedArrayRow .= pack("V",$compressedLength
);
        
$feedArrayRow .= pack("V",$uncompressedLength
);

        
$this -> compressedData[] = $feedArrayRow
;

        
$newOffset = strlen(implode("", $this->compressedData
));

        
$addCentralRecord = "\x50\x4b\x01\x02"
;
        
$addCentralRecord .="\x00\x00"
;    
        
$addCentralRecord .="\x14\x00"
;    
        
$addCentralRecord .="\x00\x00"
;    
        
$addCentralRecord .="\x08\x00"
;    
        
$addCentralRecord .="\x00\x00\x00\x00"
;
        
$addCentralRecord .= pack("V",$compression
);
        
$addCentralRecord .= pack("V",$compressedLength
);
        
$addCentralRecord .= pack("V",$uncompressedLength
);
        
$addCentralRecord .= pack("v", strlen($directoryName
) );
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("v", 0
);
        
$addCentralRecord .= pack("V", 32
);

        
$addCentralRecord .= pack("V", $this -> oldOffset
);
        
$this -> oldOffset = $newOffset
;

        
$addCentralRecord .= $directoryName
;  

        
$this -> centralDirectory[] = $addCentralRecord
;  
    }

    
/**
     * Fucntion to return the zip file
     *
     * @return zipfile (archive)
     */

    
public function getZippedfile
() {

        
$data = implode("", $this -> compressedData
);  
        
$controlDirectory = implode("", $this -> centralDirectory
);  

        return   
            
$data
.  
            
$controlDirectory
.  
            
$this -> endOfCentralDirectory
.  
            
pack("v", sizeof($this -> centralDirectory
)).     
            
pack("v", sizeof($this -> centralDirectory
)).     
            
pack("V", strlen($controlDirectory
)).             
            
pack("V", strlen($data
)).                
            
"\x00\x00"
;                             
    }

    
/**
     *
     * Function to force the download of the archive as soon as it is created
     *
     * @param archiveName string - name of the created archive file
     */

    
public function forceDownload($archiveName
) {
        
$headerInfo = ''
;
        
        if(
ini_get('zlib.output_compression'
)) {
            
ini_set('zlib.output_compression', 'Off'
);
        }

        
// Security checks
        
if( $archiveName == ""
) {
            echo
"<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> The download file was NOT SPECIFIED.</body></html>"
;
            exit;
        }
        elseif ( !
file_exists( $archiveName
) ) {
            echo
"<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> File not found.</body></html>"
;
            exit;
        }

        
header("Pragma: public"
);
        
header("Expires: 0"
);
        
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"
);
        
header("Cache-Control: private",false
);
        
header("Content-Type: application/zip"
);
        
header("Content-Disposition: attachment; filename=".basename($archiveName).";"
);
        
header("Content-Transfer-Encoding: binary"
);
        
header("Content-Length: ".filesize($archiveName
));
        
readfile("$archiveName"
);
        
     }

}
?>

测试程序:example.php

<?php

include_once("createZip.inc.php"
);
$createZip = new createZip
;  

$createZip -> addDirectory("dir/"
);

$fileContents = file_get_contents("img.jpg"
);  
$createZip -> addFile($fileContents, "dir/img.jpg"
);  


$fileName = "archive.zip"
;
$fd = fopen ($fileName, "wb"
);
$out = fwrite ($fd, $createZip -> getZippedfile
());
fclose ($fd
);

$createZip -> forceDownload($fileName
);
@
unlink($fileName
);
?>

  评论这张
 
阅读(713)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017