Php ZipArchive添加了额外的文件夹

时间:2018-02-12 14:25:04

标签: php yii2 zip

压缩服务器上的某个目录我在Windows和Linux下的zip-archive中收到了额外的文件夹。

enter image description here

额外文件夹"3b84"是使用md5(integer)函数在getExportPaths()方法中设置文件名的结尾。如果我尝试缩短文件名 - 它会让我成为一个zip存档,其中所有文件都放在一个目录中而没有子目录,如" CSS"," fonts"等

为什么我使用md5()还有一个重要的事情 - 我需要将很多zip档案粘贴到一个目录中。所以他们的名字应该是独一无二的。

如何修复此问题并删除名称类似" 3b84"?

的额外文件夹
public function actionExportdocument($id)
{
    $model = Order::findOne(['id' => $id, 'user_id' => Yii::$app->user->getId()]);

    if (!$model) {
        throw new BadRequestHttpException('Export not found.');
    }


    $paths = Order::getExportPaths($model->id, $model->design->path);
    $prepareFiles = Order::prepareFiles($paths, $model);

    $zip = new ZipArchive();
    $zip->open($paths['exportRoot'] . DIRECTORY_SEPARATOR . $paths['exportFile'],
        ZipArchive::CREATE | ZipArchive::OVERWRITE);

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($paths['exportPath']),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file)
    {
        // Skip directories (they would be added automatically)
        if (!$file->isDir())
        {
            $filePath = $file->getRealPath();
            $relativePath = substr($filePath, strlen($paths['designPath']) + 1);
            $zip->addFile($filePath, $relativePath);
        }
    }
    $zip->close();

    FileHelper::sendFile($paths['exportRoot'] . DIRECTORY_SEPARATOR . $paths['exportFile'], 'script.zip');
}

订单类包含:

public static function getExportPaths($modelId, $designPath)
{
    $paths['orderIdHash'] = md5($modelId);

    $paths['designPath'] = \Yii::getAlias('@app') . DIRECTORY_SEPARATOR . 'designs' . DIRECTORY_SEPARATOR . $designPath;
    $paths['exportRoot'] = \Yii::getAlias('@webroot') . DIRECTORY_SEPARATOR . 'export-document';
    $paths['exportPath'] =  $paths['exportRoot'] . DIRECTORY_SEPARATOR . $paths['orderIdHash'];
    $paths['exportFile'] = $paths['orderIdHash'] . '.zip';

    return $paths;
}

public static function prepareFiles($paths, $model)
{
    $exportDir = \Yii::getAlias('@webroot') . DIRECTORY_SEPARATOR . 'export-document';
    if (!is_dir($exportDir)) {
        mkdir($exportDir);
    }

    FileHelper::deleteDirectory($paths['exportPath']);
    FileHelper::copyRecursive($paths['designPath'], $paths['exportPath']);

    $content = '';
    foreach ($model->orderTemplates as $template) {
        $content .= $template->value;
    }

    $str = file_get_contents($paths['exportPath'] . DIRECTORY_SEPARATOR . 'index.html');
    $str = str_replace("{{CONTENT}}", $content, $str);
    file_put_contents($paths['exportPath'] . DIRECTORY_SEPARATOR . 'index.html', $str);

}

2 个答案:

答案 0 :(得分:0)

如果我正确地读了你的问题;您希望删除生成的os.path.isdir等文件夹 查看/3b84/

Order class

请参阅public static function getExportPaths($modelId, $designPath) { $paths['orderIdHash'] = md5($modelId); $paths['designPath'] = \Yii::getAlias('@app') . DIRECTORY_SEPARATOR . 'designs' . DIRECTORY_SEPARATOR . $designPath; $paths['exportRoot'] = \Yii::getAlias('@webroot') . DIRECTORY_SEPARATOR . 'export-document'; $paths['exportPath'] = $paths['exportRoot'] . DIRECTORY_SEPARATOR . $paths['orderIdHash']; $paths['exportFile'] = $paths['orderIdHash'] . '.zip'; return $paths; }
删除它,您的新路径将不再包含$paths['exportPath'] = $paths['exportRoot'] . DIRECTORY_SEPARATOR . $paths['orderIdHash'];等文件夹。

答案 1 :(得分:0)

问题在于我指定了错误的$relativePath

此字符串不正确

$relativePath = substr($filePath, strlen($paths['designPath']) + 1);  

而不是

$relativePath = substr($filePath, strlen($paths['exportPath']) + 1);