TP导出ZIP图片

TP导出ZIP图片

1,在TP里vendor创建类文件 PHPZip.php

<?php
class PHPZip {
	var $datasec = array ();
	var $ctrl_dir = array ();
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
	var $old_offset = 0;

	function unix2_dostime($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;
		}
		return (($timearray ['year'] - 1980) << 25) | ($timearray ['mon'] << 21) | ($timearray ['mday'] << 16) | ($timearray ['hours'] << 11) | ($timearray ['minutes'] << 5) | ($timearray ['seconds'] >> 1);
	}
	function add_file($data, $name, $time = 0){
		$name = str_replace('\\', '/', $name);

		$dtime = dechex($this->unix2_dostime($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";
		$fr .= "\x00\x00";
		$fr .= "\x08\x00";
		$fr .= $hexdtime;

		$unc_len = strlen($data);
		$crc = crc32($data);
		$zdata = gzcompress($data);
		$zdata = substr(substr($zdata, 0, strlen($zdata)- 4), 2);
		$c_len = strlen($zdata);
		$fr .= pack('V', $crc);
		$fr .= pack('V', $c_len);
		$fr .= pack('V', $unc_len);
		$fr .= pack('v', strlen($name));
		$fr .= pack('v', 0);
		$fr .= $name;

		$fr .= $zdata;
		$fr .= pack('V', $crc);
		$fr .= pack('V', $c_len);
		$fr .= pack('V', $unc_len);

		$this->datasec [] = $fr;

		$cdrec = "\x50\x4b\x01\x02";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x14\x00";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x08\x00";
		$cdrec .= $hexdtime;
		$cdrec .= pack('V', $crc);
		$cdrec .= pack('V', $c_len);
		$cdrec .= pack('V', $unc_len);
		$cdrec .= pack('v', strlen($name));
		$cdrec .= pack('v', 0);
		$cdrec .= pack('v', 0);
		$cdrec .= pack('v', 0);
		$cdrec .= pack('v', 0);
		$cdrec .= pack('V', 32);

		$cdrec .= pack('V', $this->old_offset);
		$this->old_offset += strlen($fr);

		$cdrec .= $name;

		$this->ctrl_dir[] = $cdrec;
	}
	function add_path($path, $l = 0){
		$d = @opendir($path);
		$l = $l > 0 ? $l : strlen($path) + 1;
		while($v = @readdir($d)){
			if($v == '.' || $v == '..'){
				continue;
			}
			$v = $path . '/' . $v;
			if(is_dir($v)){
				$this->add_path($v, $l);
			} else {
				$this->add_file(file_get_contents($v), substr($v, $l));
			}
		}
	}
	function file(){
		$data = implode('', $this->datasec);
		$ctrldir = implode('', $this->ctrl_dir);
		return $data . $ctrldir . $this->eof_ctrl_dir . pack('v', sizeof($this->ctrl_dir)) . pack('v', sizeof($this->ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00";
	}

	function add_files($files){
		foreach($files as $file){
			if (is_file($file)){
				$data = implode("", file($file));
				$this->add_file($data, $file);
			}
		}
	}
	function output($file){
		$fp = fopen($file, "w");
		fwrite($fp, $this->file ());
		fclose($fp);
	}
}

2,创建ZIP方法

/**
	 * 导出商品图片到zip
	 * $data 图片数组$image = array(array('image_src' => $pic, 'image_name' => 'pic/图片2.jpg'),);
	 * image_src 图片路径
	 * image_name 图片名称及保存路径
	 */
	public function outGoodsPic($data){
		vendor("PHPZip");
		$tmp_path = SITE_PATH."/Uploads/tmp";
		$dfile =  tempnam($tmp_path, 'tmp');//产生一个临时文件,用于缓存下载文件
		//var_dump($tmp_path);exit;
		$zip = new \PHPZip();
		//----------------------
		$filename = 'image.zip'; //下载的默认文件名
		$image = $data;
		foreach($image as $v){
			$zip->add_file(file_get_contents($v['image_src']),  $v['image_name']);
			// 添加打包的图片,第一个参数是图片内容,第二个参数是压缩包里面的显示的名称, 可包含路径
			// 或是想打包整个目录 用 $zip->add_path($image_path);
		}
		//----------------------
		$zip->output($dfile);
		
		// 下载文件
		ob_clean();
		header('Pragma: public');
		header('Last-Modified:'.gmdate('D, d M Y H:i:s') . 'GMT');
		header('Cache-Control:no-store, no-cache, must-revalidate');
		header('Cache-Control:pre-check=0, post-check=0, max-age=0');
		header('Content-Transfer-Encoding:binary');
		header('Content-Encoding:none');
		header('Content-type:multipart/form-data');
		header('Content-Disposition:attachment; filename="'.$filename.'"'); //设置下载的默认文件名
		header('Content-length:'. filesize($dfile));
		$fp = fopen($dfile, 'r');
		while(connection_status() == 0 && $buf = @fread($fp, 8192)){
			echo $buf;
		}
		fclose($fp);
		@unlink($dfile);
		@flush();
		@ob_flush();
		exit();
	}

3,开始调用

public function outzip(){
		header("Content-type:text/html;charset=utf-8");
		$list_data = $this->_get_model_list ( $this->model );
		$rand_zm = rand("a","z");
		foreach ( $list_data ['list_data'] as $key => &$vo ) {
			$rand_number = rand(10000000,99999999);
			$str = "/Uploads";
			$vo ['pic'] = SITE_PATH.strstr(get_cover_url($vo['cover']),$str);
			$data[$key]['image_src'] = $vo['pic'];
			$data[$key]['image_name'] = 'pic/'.$rand_number.$rand_zm.$key.".jpg";
		}
		//var_dump($data);exit;
		$this->outGoodsPic($data);
	}



回复列表


回复操作