【问题标题】:How can I extract a file zip into a directory created before by code (PHP)?如何将文件 zip 提取到之前由代码(PHP)创建的目录中?
【发布时间】:2017-11-04 03:09:07
【问题描述】:

我想将文件 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():没有这样的文件或目录)

我该如何解决?

谢谢!

【问题讨论】:

  • 检查您要提取的文件路径
  • 我的猜测是 ziparchive 需要完整路径。如果开放有效,则路径应该存在。但是,您使用的是相对路径。试试__DIR__."Apps\\".$username
  • 我不认为这是路径的问题,因为如果我这样写的话.. $zip->extractTo("Apps\folderCreatedManually");而不是 $zip->extractTo("Apps\\".$username);它工作!
  • 是的,这是路径问题,错误消息也告诉路径问题

标签: php unzip


【解决方案1】:

这是您的路径问题,因此请更新您的路径,然后它将完美运行,这是演示代码,可帮助您上传 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>

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

【讨论】:

  • 你为什么把$target_path放在''之间?返回 false ,因此它永远不会进入 if 肯定条件。出现通常的错误。
  • 目标路径是你的文件路径名,在下面的例子中检查它
  • 好的,它工作!但它只复制目标文件夹中没有扩展名的 zip 存档而不提取它..
  • 你的意思是只复制文件夹而不是提取?
  • 所以你的提取不起作用,move_uploaded_file 正常工作
【解决方案2】:

我已经解决了:

$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])

谢谢大家!

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多