ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP – ZipArchive()权限问题与清理

2019-07-10 15:31:04  阅读:520  来源: 互联网

标签:php permissions ziparchive


我一直在 – 我认为权限问题 – 解压缩文件(这部分没问题)并将内容移动到写文件夹.

我正在运行简单的代码:

$zip  = new ZipArchive( );
$x    = $zip->open( $file );
if ( $x === true ) {

  $zip->extractTo( $target );
  $zip->close( );
  unlink( $file );

  rmove( __DIR__ . '/' . $target . '/dist', __DIR__ );
} else {

  die( "There was a problem. Please try again!" );
}

其中rmove()是一个简单的递归函数,它迭代内容并将rename()应用于每个文件.

问题是解压缩顺利,文件被复制,但没有被移动 – 从临时文件夹中删除.到目前为止,我读到的可能是由于在重命名时没有对解压缩文件的写入权限.

如何在解压缩时控制这些权限?

更新:rmove()的内容:

function rmove( $src, $dest ) {

    // If source is not a directory stop processing
    if ( ! is_dir( $src ) ) return false;

    // If the destination directory does not exist create it
    if ( ! is_dir( $dest ) ) {

      if ( ! mkdir( $dest ) ) {
        // If the destination directory could not be created stop processing
        return false;
      }
    }

    // Open the source directory to read in files
    $i = new DirectoryIterator( $src );
    foreach( $i as $f ) {

      if ( $f->isFile( ) ) {

        echo $f->getRealPath( ) . '<br/>';
        rename( $f->getRealPath( ), "$dest/" . $f->getFilename( ) );
      } else if ( ! $f->isDot( ) && $f->isDir( ) ) {

        rmove( $f->getRealPath( ), "$dest/$f" );
        unlink( $f->getRealPath( ) );
      }
    }
    unlink( $src );
}

解决方法:

据我所知ZipArchive :: extractTo没有设置任何特殊的写/删除权限,因此您应该拥有对提取文件的完全访问权限.

你的代码的问题是rmove函数.您正在尝试使用取消链接删除目录,但取消链接会删除文件.您应该使用rmdir删除目录.

如果我们解决了这个问题,你的rmove函数可以正常工作.

function rmove($src, $dest) {
    // If source is not a directory stop processing
    if (!is_dir($src)) {
        return false;
    }
    // If the destination directory does not exist create it
    if (!is_dir($dest) && !mkdir($dest)) {
        return false;
    }
    // Open the source directory to read in files
    $contents = new DirectoryIterator($src);
    foreach ($contents as $f) {
        if ($f->isFile()) {
            echo $f->getRealPath() . '<br/>';
            rename($f->getRealPath(), "$dest/" . $f->getFilename());
        } else if (!$f->isDot() && $f->isDir()) {
            rmove($f->getRealPath(), "$dest/$f");
        }
    }
    rmdir($src);
}

您不必删除循环中的每个子文件夹,最后的rmdir将删除所有文件夹,因为这是一个递归函数.

如果仍然无法删除该文件夹的内容,则可能没有足够的权限.我认为这不太可能,但在这种情况下你可以试试chmod.

标签:php,permissions,ziparchive
来源: https://codeday.me/bug/20190710/1425028.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有