Структура каталогов при распаковке файла на сервере с PHP - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть сайт, который я создаю, когда пользователь регистрируется. Я распаковываю файл, который содержит текущую структуру папок для профиля пользователя.

Структура папок находится в каталоге пользователей в виде zip /u/folders.zip. Я думал, что я делал, создавая следующую структуру:

-u
--folders.zip
--newamazingusername
---index.php
---folder1
---folder2
----subfolder1
----subfolder2
---folder3

Вместо этого она создает:

-u
--folders.zip
--newamazingusername
---folders
----index.php
----folder1
----folder2
-----subfolder1
-----subfolder2
----folder3

Обработка файла:

<?php
require_once( "../../assets/inc/connection.php" );

if ( !empty($_GET['email']) && !empty($_GET['username']) ):
    $get_username = $_GET['username'];
    $get_email = $_GET['email'];

    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $hash = **[REDACTED CODE] Assume I am Hashing my password properly**
        $sql = "UPDATE users SET username='" . $get_username . "' WHERE email='" . $get_email . "'";
        // use exec() because no results are returned
        $conn->exec($sql);

        $zip = new ZipArchive;
        $fileLocation = $_SERVER['DOCUMENT_ROOT'] . '/u/folders.zip';
        $newfile = $_SERVER['DOCUMENT_ROOT'] . '/u/' . $get_username . '.zip';

        if (!copy($fileLocation, $newfile)) {
            echo "failed to copy";
            header('Location: http://' . $_SERVER['HTTP_HOST'] . '?error=foldercopyfail');
            exit();
        }
        $res = $zip->open($newfile);
        if ($res === TRUE) {
            $zip->extractTo($_SERVER['DOCUMENT_ROOT'] . '/u/' . $get_username);
            $zip->close();

            header('Location: http://' . $_SERVER['HTTP_HOST'] . '/u/' . $get_username );
        } else {
            echo 'doh!';
        }
        unlink($newfile);

        exit();
    } catch(PDOException $e) {
        echo $sql . "<br>" . $e->getMessage();
    }

else :
    header('Location: http://' . $_SERVER['HTTP_HOST'] . '?error=noaccess');
endif;


?>

Мне нужно разархивировать папки в zip-архиве в корне пользовательской папки.Я почти уверен, что проблема с copy () if snippet.

Спасибо за помощь!

1 Ответ

0 голосов
/ 02 декабря 2018

Попробуйте изменить это:

$res = $zip->open($newfile);
if ($res === TRUE) {
    $zip->extractTo($_SERVER['DOCUMENT_ROOT'] . '/u/' . $get_username);
    $zip->close();

    header('Location: http://' . $_SERVER['HTTP_HOST'] . '/u/' . $get_username );
} else {
    echo 'doh!';
}

с этим:

$res = $zip->open($newfile);
if ($res === TRUE) {
    for($i = 0; $i < $zip->numFiles; $i++) {
        $filename = $zip->getNameIndex($i);
        $fileinfo = pathinfo($filename);
        copy("zip://".$newfile."#".$filename, $_SERVER['DOCUMENT_ROOT'] . '/u/' . $get_username . $fileinfo['basename']);
    }
    $zip->close();

    header('Location: http://' . $_SERVER['HTTP_HOST'] . '/u/' . $get_username );
} else {
    echo 'doh!';
}

Пожалуйста, прочитайте примечание пользователя на странице документации php extractTo() длялучшее объяснение.

...