如何将文件 zip 解压缩到之前由代码 (PHP) 创建的目录中?

How can I extract a file zip into a directory created before by code (PHP)?

我想将文件 zip 解压缩到之前使用 PHP 代码创建的目录中,但它不起作用。我认为这是权限问题,因为如果我手动创建该文件夹,它就可以工作,如果我从我的脚本创建它,它就不起作用!

....
$filename = $_FILES["userfile"]["name"];
$source = $_FILES["userfile"]["tmp_name"];
$name = explode(".", $filename);
$target_path = "Apps\" . $username . "\" . $name[0]; 

if(move_uploaded_file($source, $target_path))
{       
    $zip = new ZipArchive();
    $x = $zip->open($target_path);
    if ($x === true)
    {
       $zip->extractTo("Apps\".$username); <- ERROR ON THIS LINE
       $zip->close();
    }
 ....

这是错误:(警告:ZipArchive::extractTo():没有那个文件或目录)

我该如何解决?

谢谢!

这是您的路径问题,因此请更新您的路径,然后它将完美运行,这是演示代码,可帮助您上传 zip 文件并将此 zip 解压缩到与 zip 文件夹相同的文件中。

<?php
function rmdir_recursive($dir) {
    foreach(scandir($dir) as $file) {
        if ('.' === $file || '..' === $file) continue;
        if (is_dir("$dir/$file")) rmdir_recursive("$dir/$file");
        else unlink("$dir/$file");
    }

    rmdir($dir);
}

if(!empty($_FILES["file_name"]["name"])) {
    $filename = $_FILES["file_name"]["name"];
    $source = $_FILES["file_name"]["tmp_name"];
    $type = $_FILES["file_name"]["type"];

    $name = explode(".", $filename);
    $accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed');
    foreach($accepted_types as $mime_type) {
        if($mime_type == $type) {
            $okay = true;
            break;
        }
    }

    $continue = strtolower($name[1]) == 'zip' ? true : false;
    if(!$continue) {
        $message = "The file you are trying to upload is not a .zip file. Please try again.";
    }

    $path = dirname(__FILE__).'/';  
    $filenoext = basename ($filename, '.zip');
    $filenoext = basename ($filenoext, '.ZIP');

    $targetdir = $path . $filenoext; 
    $targetzip = $path . $filename; 
    if (is_dir($targetdir))  rmdir_recursive ( $targetdir);

    mkdir($targetdir, 0777);

    if(move_uploaded_file($source, $targetzip)) {
        $zip = new ZipArchive();
        $x = $zip->open($targetzip);
        if ($x === true) {
            $zip->extractTo($targetdir.'/');
            $zip->close();

            unlink($targetzip);
        }
        $message = "Your file is uploaded and unpacked.";
    } else {
        $message = "There is a problem to upload.";
    }
}

?>

<?php if(isset($message)) echo "<p>$message</p>"; ?>
<form enctype="multipart/form-data" method="post" action="">
    <label>Upload a zip file to upload: <input type="file" name="file_name" /></label>
    <br />
    <input type="submit" name="submit" value="Upload" />
</form>

希望对您和其他人有所帮助

我已经解决了:

$filename = $_FILES["userfile"]["name"];
$source = $_FILES["userfile"]["tmp_name"];

$name = explode(".", $filename);
$target_path = "Apps/" . $username . "/" . $name[0]. "." .$name[1];    

if(move_uploaded_file($source, $target_path))
{       
    $zip = new ZipArchive();
    $x = $zip->open($target_path);
    if ($x === true)
    {
        $zip->extractTo("Apps/" . $username . "/");
        $zip->close();
    }
}

这是 $target_path 的问题,因为它需要扩展名 ($name[1])

感谢大家!