windows环境PHP调用DotNetZipLib处理zip64文件

项目功能:web系统为整个项目系统的软件提供自动升级功能

具体流程:用户在web系统上传更新文件,然后PHP将文件压缩为zip包,C#编写的客户端服务软件下载该zip包并解压到相应的软件目录进行软件更新

功能问题:PHP的zipArchive类只能支持常规zip文件的压缩,而C#客户端需要zip64格式的压缩文件,所以我们这里需要用PHP的COM类来加载DotNetZipLib的Ionic.Zip.ZipFile库


系统环境

系统:windows

php版本:5.3.8

说明:如果是php5.3.15之后的版本需要下载php的zip-source包将ext目录的php_com_dotnet.dll扩展加入进去

DotNetZipLib包下载:http://dotnetzip.codeplex.com/releases/view/68268


第一步 将DotNetZip注册为COM组件

用到的工具:

gacutil.exe 下载:http://pan.baidu.com/share/link?shareid=477269&uk=704879932

regasm.exe 下载:http://pan.baidu.com/share/link?shareid=477270&uk=704879932

1、将DotNetZipLib包解压之后zip-v1.9/Release目录下的Ionic.Zip.dll文件复制到C:\目录下,下载

2、开始->运行->cmd 切换到C盘  cd C:\

3、安装到GAC  gacutil -i Ionic.Zip.dll

如果提示缺少MSVCR70.dll请下载http://pan.baidu.com/share/link?shareid=478218&uk=704879932 解压复制到C:\WINDOWS\SYSTEM32目录下

4、注册到COM组件服务  regasm Ionic.Zip.dll

如果下载的regasm.exe注册出错,那进入C:\WINDOWS\Microsoft.NET\Framework\v.xxx目录找到RegAsm.exe,用该程序注册COM服务

完成之后Ionic.Zip.dll就可以当做COM组件服务被PHP的COM类调用了


第二步 启用PHP的COM扩展

参考文章:http://blog.csdn.net/luochuan/article/details/8806689


编写PHP代码调用Ionic.Zip.ZipFile类生成ZIP文件

创建zip文件 zipfile.php

<?php
//创建zip文件
try {
	echo '<html>';
	echo '  <head>';
	echo '  <title>Calling .NET from PHP through COM</title>';
	echo '  <meta content="text/html; charset=GB2312" http-equiv="Content-Type">';
	echo '  </head>';
	echo '<body>';

	echo '<h2>Hello!</h2>' . "<br/>\n";
	echo '<h4>Trying static method</h4>' . "<br/>\n";
	$filename = "archive-" . date('Y-m-d_His') . ".zip";
	echo 'Dynamically generated archive name: ' . "\n" . '<h4>' . $filename . "</h4>\n";

	$zipFile = "c:/xampp/htdocs/" . $filename;
	//COM类加载Ionic.Zip.ZipFile动态库
	$zip = new COM("Ionic.Zip.ZipFile");
	//定义文件名
	$zip->name = $zipFile;
	//加密等级为0不加密 值为3则需要密码
	$zip->Encryption = 0;
	//密码不需要
	// $zip->Password = "";
	//用zip64方式压缩文件
	$zip->UseZip64WhenSaving = 2;

	//设置要压缩的目录
	$dirToZip= "c:/xampp/htdocs/work";
	$zip->AddDirectory($dirToZip);
	//执行压缩操作
	$zip->Save();

	echo '<br/>The file was saved to ' . $zip->Name . '<br/>' . "\n";

	$zip->Dispose();

	echo '</body>';
	echo '</html>';

} catch (Exception $e) {
	echo 'Caught exception: ',  $e->getMessage(), "\n";
	echo '<pre>';
	echo $e->getTraceAsString(), "\n";
	echo '</pre>';
}


解压zip文件unzipfile.php

<?php
//解压zip文件
try {
	echo '<html>';
	echo '  <head>';
	echo '  <title>Calling .NET from PHP through COM</title>';
	echo '  <meta content="text/html; charset=GB2312" http-equiv="Content-Type">';
	echo '  </head>';
	echo '<body>';

	echo '<h2>Hello!</h2>' . "<br/>\n";
	echo '<h4>Trying static method</h4>' . "<br/>\n";

	$zipDir = "c:/xampp/htdocs/";
	$zipFile = "archive-2013-04-16.zip";

	//COM类加载Ionic.Zip.ZipFile动态库
	$zip = new COM("Ionic.Zip.ZipFile");
	//初始化zip文件
	$zip->Initialize($zipDir.$zipFile);
	//解压zip文件
	$zip->ExtractAll($zipDir);
	//处理过程
	$zip->Dispose();

	echo '<h2>Unzip Success!</h2>' . "<br/>\n";
	echo '</body>';
	echo '</html>';

} catch (Exception $e) {
	echo 'Caught exception: ',  $e->getMessage(), "\n";
	echo '<pre>';
	echo $e->getTraceAsString(), "\n";
	echo '</pre>';
}



参考资料:http://dotnetzip.herobo.com/DNZHelp/Code%20Examples/COM.htm




你可能感兴趣的:(windows环境PHP调用DotNetZipLib处理zip64文件)