php 制作的 zip 文件在 js-dos 中显示错误的文件夹结构但在 windows 中正确
zip file made by php shows wrong folder structure in js-dos but correct in windows
我正在做一个项目,它需要我从服务器收集几个文件,将它们压缩,然后使用 js-dos 将 zip 安装为驱动器。
一切正常'correctly'。在测试期间,我在 windows 和代码 运行 中手动制作了一个 zip 文件。对于最终测试,我尝试挂载 php 生成的 zip,但在 js-dos 中执行 DIR 时文件夹结构为 st运行ge。
我应该有一个包含多个文件的文件夹。相反,有几个相同的文件夹,里面只有一个文件。
让我脑洞大开的是,在winRAR中打开文件是正确的,但是在js-dos中却突然不一样了。
这是我的代码,没什么特别的:
$rootPath = realpath($filefoldername."/");
$zip = new ZipArchive();
$zip->open($filefoldername.'/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$filesZ = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($filesZ as $nameZ => $fileZ)
{
// Skip directories (they would be added automatically)
if (!$fileZ->isDir())
{
// Get real and relative path for current file
$filePath = $fileZ->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
我猜 windows 看起来有点像 dos 没有的东西。用winRAR制作的zip文件是可以的,但是这段代码生成的是st运行ge.
我想在 php 中生成 .zip,而不是通过 shell 命令。谁能帮我解决这个问题?
可能js-dos不能自动创建中间目录,你可以试试下面的代码将中间目录添加到zip文件中。
$rootPath = realpath($filefoldername."/");
$zip = new ZipArchive();
$zip->open($filefoldername.'/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$filesZ = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
// !!!! replace LEAVES_ONLY with SELF_FIRST to include intermediate directories
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($filesZ as $nameZ => $fileZ)
{
// Get real and relative path for current file
$filePath = $fileZ->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$relativePath = str_replace('\', '/', $relativePath);
if ($fileZ->isDir()) {
$zip->addEmptyDir($relativePath);
} else {
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
我正在做一个项目,它需要我从服务器收集几个文件,将它们压缩,然后使用 js-dos 将 zip 安装为驱动器。
一切正常'correctly'。在测试期间,我在 windows 和代码 运行 中手动制作了一个 zip 文件。对于最终测试,我尝试挂载 php 生成的 zip,但在 js-dos 中执行 DIR 时文件夹结构为 st运行ge。
我应该有一个包含多个文件的文件夹。相反,有几个相同的文件夹,里面只有一个文件。
让我脑洞大开的是,在winRAR中打开文件是正确的,但是在js-dos中却突然不一样了。
这是我的代码,没什么特别的:
$rootPath = realpath($filefoldername."/");
$zip = new ZipArchive();
$zip->open($filefoldername.'/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$filesZ = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($filesZ as $nameZ => $fileZ)
{
// Skip directories (they would be added automatically)
if (!$fileZ->isDir())
{
// Get real and relative path for current file
$filePath = $fileZ->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
我猜 windows 看起来有点像 dos 没有的东西。用winRAR制作的zip文件是可以的,但是这段代码生成的是st运行ge.
我想在 php 中生成 .zip,而不是通过 shell 命令。谁能帮我解决这个问题?
可能js-dos不能自动创建中间目录,你可以试试下面的代码将中间目录添加到zip文件中。
$rootPath = realpath($filefoldername."/");
$zip = new ZipArchive();
$zip->open($filefoldername.'/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$filesZ = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
// !!!! replace LEAVES_ONLY with SELF_FIRST to include intermediate directories
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($filesZ as $nameZ => $fileZ)
{
// Get real and relative path for current file
$filePath = $fileZ->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$relativePath = str_replace('\', '/', $relativePath);
if ($fileZ->isDir()) {
$zip->addEmptyDir($relativePath);
} else {
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();