- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个简单的 Zip 创建脚本,可将加载的文件复制到单个目录中,然后从该目录创建一个 .zip 文件。这种方法听起来很简单,但是它产生的文件在打开时有问题。
起初我很困惑,因为文件可以在 7Zip、WinRar 等软件中正常打开。但是,我们无法使用 Windows 内置的存档开启器。为了排除我的主服务器的任何问题,因为它使用 Nginx+PHPfpm + Fedora 16,我还在一个更标准的服务器上进行了测试,使用 Apache 和 mod_php 在 Ubuntu 服务器上运行。
在这两种情况下,问题都是一样的:存档在纯 zip 中也总是可以正常打开,但在 Windows 版本中却失败了。经过一些随机挖掘后,我想到了在 Notepad++ 中打开文件以检查其初始标题的想法。
事实证明 Ziparchive() 正在做两件它不应该做的事情。
第一个问题很简单:它包括完整路径作为存档中的空路径。它不应该是,但它是。这可能是由于我的递归,所以我可以忍受这一点
第二个问题是导致文件无法打开的大问题。它在存档的最开始处预先添加一个空字节。我所要做的就是在 Notepad++ 中手动打开文件,删除字节然后保存它,瞧:文件可以在包括 Windows 在内的所有内容中打开,完全没有问题。
**
我以前从未遇到过这种情况,快速的谷歌发现 Ziparchive() 有很多东西/问题,但我找不到任何像这样的具体东西。
这是我的 Zip 创建方法:
private function zipcreate($source, $destination) {
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = str_replace('\\', '/', realpath($source));
if (is_dir($source) === true) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file) {
$file = str_replace('\\', '/', realpath($file));
if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
continue;
$file = realpath($file);
if (is_dir($file) === true) {
$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
} else if (is_file($file) === true) {
$zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
}
}
} else if (is_file($source) === true) {
$zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
}
$this->zipcreate($newdirpath, getcwd()."/$siteid-CompliancePack.zip");
[root@sid tmp]# od --format=x1 --read-bytes=60 54709-CompliancePack.zip
0000000 50 4b 03 04 14 00 00 00 08 00 39 4e 92 45 59 28
0000020 27 b3 37 53 00 00 00 f2 00 00 36 00 00 00 47 45
0000040 4e 45 52 41 4c 5f 4e 65 77 20 53 69 74 65 20 20
0000060 48 6f 77 61 72 74 68 20 54 69 6d 62
0000074
[root@sid tmp]#
$result = $client->call('SitesClass.downloadCompliancePack', array('appusername' => 'xxx','apppassword' => 'xxx','apikey' => 'xxx','siteid' => 54709));
// Display the result
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename="54709-CompliancePack.zip"');
$base = json_decode($result[2]);
echo base64_decode($base->FileData);
<?php
// get configuration
include "system/config.php";
include "pages/pageclasses/carbon.class.php";
//////////// document action ///////////////
$sid = $_GET['sid'];
// Pull in the NuSOAP code
require_once('lib/nusoap.php');
// Create the client instance
$client = new nusoap_client($api_link); // using nosoap_client
// Call the SOAP method
$result = $client->call('SitesClass.downloadCompliancePack', array('appusername' => $api_username,'apppassword' => $api_password,'apikey' => $api_key,'siteid' => $sid));
// Display the result
$base = json_decode($result[2]);
echo "<textarea>".bin2hex(trim(base64_decode($base->FileData)))."</textarea>";
?>
<?php
// get configuration
include "system/config.php";
include "pages/pageclasses/carbon.class.php";
//////////// document action ///////////////
$sid = $_GET['sid'];
// Pull in the NuSOAP code
require_once('lib/nusoap.php');
// Create the client instance
$client = new nusoap_client($api_link); // using nosoap_client
// Call the SOAP method
$result = $client->call('SitesClass.downloadCompliancePack', array('appusername' => $api_username,'apppassword' => $api_password,'apikey' => $api_key,'siteid' => $sid));
// Display the result
header('Content-type:application/octet-stream');
header('Content-disposition:attachment;filename="'.$sid.'-CompliancePack.zip"');
$base = json_decode($result[2]);
echo trim(base64_decode($base->FileData));
?>
header('Content-type:application/octet-stream');
header('Content-disposition:attachment;filename="'.$sid.'-CompliancePack.zip"');
echo trim(base64_decode($base->FileData));
最佳答案
关于你的第一个问题,我建议使用
"remove_path"
Prefix to remove from matching file paths before adding to the archive.
关于php - ZipArchive() 向存档添加空字节的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27419095/
我已经编写了如下方法将多个 Memorystream 绑定(bind)到 ziparchive。该代码适用于一个流,但如果我通过迭代添加多个流,则它会在 for 循环的第二行显示以下错误。 Syst
我刚刚通过 composer 下载了 PhpSpreadsheet 包,我试图生成一个 Excel 电子表格。但我得到的只是一个错误“ Class ZipArchive not found ”。我在
我目前将大量照片存储在 LAMP 服务器上的 zip 存档中。当新用户添加到我的程序时,我打开 zip 存档并添加他们的照片。 问题是当 zip 存档接近 50MB 时,函数 ZipArchive::
我需要解压缩上传的内容。但是为了安全起见,必须验证这些文件只是图像文件,这样就无法将 php 添加到 zip 中,然后再运行它。 在进行解压缩时,我还需要保留文件结构。 $zip->extractTo
我正在使用 php ZipArchive,但遇到了一个简单的问题。 我需要创建新文件,如果存在同名的文件,我需要覆盖它。 我的问题是,如果我使用此代码 if ($zip->open($packageF
我已经包括了libz.1.2.3.dylib 插入代码后 ZipArchive* za = [[ZipArchive alloc] init]; 编译时出错 "_OBJC_CLASS_$_ZipAr
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我的方法接受一个列表并创建一个 ZIP 文件和一个日志文件。它适用于较小数量的文件。但是当我获取大量文件(测试了 11,000 个)时,它会引发 SystemOutOfMemory 异常。 通过研究,
我在处理程序中使用 ZipArchive 来为使用内存流和 Web 处理程序的用户提供服务。在我将应用程序上传到实时站点之前,这在本地一直有效。 这是我的代码。 using (ZipArchive n
我正在编写桌面 WPF 应用程序 (.Net Framework 4.5),其中一项任务是将多个文件保存到 zip 存档。我做了2种方法。首先创建 zip,其次从中读取。 public sta
当使用 ZipArchive 解压缩包时,它似乎阻塞了主线程。 zip 文件中大约有 283 个文件。我把它放在后台线程上,但它似乎没有帮助。 dispatch_async(dispatch_get_
我将使用 PHP 类创建一个 Zip 存档。但它仍然无法正常工作。它不会失败,响应是 1。他没有创建 Zip 文件。 $zip = new ZipArchive; $res = $zip->open(
所以我有一些代码可以捕获屏幕并将其保存到 jpeg 文件中。这工作正常,但是我想将 jpeg 编码的捕获保存到新的 ZipArchive,而不是先将位图写入文件系统。 这是我目前所拥有的: FileI
我可以使用相对路径压缩文件吗? 例如: $zip->addFile('c:/wamp/www/foo/file.txt'); ZIP 应具有如下目录结构: foo -> file.txt 而不是:
我正在使用 php ZipArchive 类来生成 zip 存档。我使用 addFile 方法的第二个参数来设置存档中文件的名称(因为磁盘上的真实文件具有不同的名称)。某些名称必须包含法国口音(例如
我有一个简单的 Zip 创建脚本,可将加载的文件复制到单个目录中,然后从该目录创建一个 .zip 文件。这种方法听起来很简单,但是它产生的文件在打开时有问题。 起初我很困惑,因为文件可以在 7Zip、
我刚开始尝试编写一些 PHP 代码以在 EC2 服务器上的 Linux 机器上运行,它将从我的 S3 存储桶中读取文件,压缩它们,然后将 zip 文件写回存储桶。 即使从 EC2 实例的本地磁盘上的一
我正在尝试修复一些图像的自动压缩脚本中的问题,这是我不久前编写的,并且一直有效到现在。一切似乎都很好,直到 $zip->close(); 给出以下内容: Warning: ZipArchive::
我正在尝试使用一些字节数组数据动态创建一个 zip 流,并通过我的 MVC 操作下载它。 但是下载的文件在windows中打开时总是出现以下损坏的错误。 当我尝试从 7z xtract 时出现此错误
我一直有 - 我认为权限问题 - 解压缩文件(这部分没问题)并将内容移动到写入文件夹。 我正在运行简单的代码: $zip = new ZipArchive( ); $x = $zip->ope
我是一名优秀的程序员,十分优秀!