PHP FTP функции ftp_pwd и ftp_cdup не работают - PullRequest
0 голосов
/ 22 октября 2019

В рамках сетевого ftp, над которым я работал, ftp_cdup($connection) всегда устанавливает текущий каталог в корневой каталог, а ftp_pwd($connection) всегда возвращает "/". Я потратил часы, сосредотачиваясь на области действия, но это не могло возможно решить проблему (я попытался отладить, устанавливая это в переменной сеанса только, чтобы это все еще приводило к неопределенной ошибке индекса). Если я укажу текущий каталог до запуска echoTableData(), то на выходе будут все файлы в указанном мной каталоге. Мне действительно нужна помощь, и мне больше не о чем спрашивать.

<?php
session_start();
if(isset($_SESSION['data']['h'])){
    $s=$_SESSION['data'];
    if(!$conn=ftp_connect($s['h'], 21)){
        require('./logout.php');
        die("failed to connect to ".$s['h'].";;error");
    }else{
        if(ftp_login($conn, $s['u'], $s['p']) != 1){
            require('./logout.php');
            die("authentication failed;;error");
        }else{
            $_SESSION['data']=array('h' => $s['h'],'u' => $s['u'],'p' => $s['p']);
        }
    }
    function formatBytes($size){
        $base = log($size, 1024);
        $suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB');
        return round(pow(1024, $base - floor($base)), 2) .' '. $suffixes[floor($base)];
    }
    function get_mime_type($filename){
        $ext = explode('.',$filename);
        $ext = strtolower(end($ext));
        $mimet = array(
            // main
            'txt' => 'text/plain',
            'htm' => 'text/html',
            'html' => 'text/html',
            'php' => 'application/x-httpd-php',
            'css' => 'text/css',
            'js' => 'application/javascript',
            'json' => 'application/json',
            'xml' => 'application/xml',
            'swf' => 'application/x-shockwave-flash',
            'flv' => 'video/x-flv',
            'less' => 'text/plain',
            'htaccess' => 'text/x-generic',
            'conf' => 'text/x-config',
            // images
            'png' => 'image/png',
            'jpe' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'bmp' => 'image/bmp',
            'ico' => 'image/vnd.microsoft.icon',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'svg' => 'image/svg+xml',
            'svgz' => 'image/svg+xml',
            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            'exe' => 'application/x-msdownload',
            'msi' => 'application/x-msdownload',
            'cab' => 'application/vnd.ms-cab-compressed',
            // audio/video
            'mp3' => 'audio/mpeg',
            'qt' => 'video/quicktime',
            'mov' => 'video/quicktime',
            'mp4' => '  video/mp4',
            // adobe
            'pdf' => 'application/pdf',
            'psd' => 'image/vnd.adobe.photoshop',
            'ai' => 'application/postscript',
            'eps' => 'application/postscript',
            'ps' => 'application/postscript',
            // ms office
            'doc' => 'application/msword',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',
            'docx' => 'application/msword',
            'xlsx' => 'application/vnd.ms-excel',
            'pptx' => 'application/vnd.ms-powerpoint',
            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
            );
        if(isset($mimet[$ext])){
            return $mimet[$ext];
        }else{
            return 'application/octet-stream';
        }
    }
    function getClassName($filename){
        $ext = explode('.',$filename);
        $ext = strtolower(end($ext));
        $imgExts = array('png','jpe','jpeg','jpg','gif','bmp','ico','tiff','tif','svg','svgz');
        $codeExts = array('htm','html','php','css');
        $archiveExts = array('zip','rar','exe','msi','cab','tar','gz');
        $videoExts = array('qt','mov','mp4');
        if(in_array($ext, $imgExts)){
            return 'far fa-file-image';
        }elseif(in_array($ext, $codeExts)){
            return 'far fa-file-code';
        }elseif(in_array($ext, $archiveExts)){
            return 'far fa-file-archive';
        }elseif(in_array($ext, $videoExts)){
            return 'far fa-file-video';
        }elseif($ext == 'mp3'){
            return 'far fa-file-audio';
        }elseif($ext == 'pdf'){
            return 'far fa-file-pdf';
        }else{
            return 'fas fa-file-alt';
        }
    }
    function echoTableData(){
        $list = ftp_nlist($GLOBALS['conn'], ".");
        foreach ($list as $name){
            if ($name != '.' && $name != '..' && ftp_size($GLOBALS['conn'], $name) == "-1") {
                $size = ftp_size($GLOBALS['conn'],$name);
                $flmod = ftp_mdtm($GLOBALS['conn'],$name);
                $path = ftp_pwd($GLOBALS['conn'])."/".$name;
                // Setting this path variable will work but not setting the variable at the bottom of this function
                echo "
                <tr class='selector' id='$name' dir='$path' onclick=\"selectItem('$path',this);\" ondblclick=\"request('cd','$path')\">
                    <td class='icon'><i class='fas fa-folder' style='color:#FFBF00'></i></td>
                    <td class='name'><p style='display:inline-block;margin:0;'>$name</p></td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>httpd/unix-directory</td>
                    <td>&nbsp;</td>
                </tr>";
            }
        }
        foreach ($list as $name){
            if ($name != '.' && $name != '..' && ftp_size($GLOBALS['conn'], $name) != "-1") {
                $fsize = ftp_size($GLOBALS['conn'],$name);
                $flmod = ftp_mdtm($GLOBALS['conn'],$name);
                $fmime = get_mime_type($name);
                $path = ftp_pwd($GLOBALS['conn'])."/".$name;
                if($fsize == 0){
                    $fsizet = $fsize . " B";
                }else{
                    $fsizet = formatBytes($fsize);
                }
                $flmodt = date("M d Y H:i:s",$flmod);
                echo "
                <tr class='selector' id='$name' dir='$path' onclick=\"selectItem('$path',this);\">
                    <td class='icon'><i class='".getClassName($name)."' style='color:#BA55D3'></i></td>
                    <td class='name'><p style='display:inline-block;margin:0;'>$name</p></td>
                    <td>$fsizet</td>
                    <td>$flmodt</td>
                    <td>$fmime</td>
                    <td>&nbsp;</td>
                </tr>
                ";
            }
        }
        $pwd = ftp_pwd($GLOBALS['conn']);
        // This variable gives the undefined error message
    }
}
if(!isset($_POST['mode'])){?><!DOCTYPE html>
    <html>
    <head>
    <title>412Quack FTP client</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="412Quack FTP Client">
    <meta name="author" content="Griffin">
    <link rel="shortcut icon" href="./favicon.ico">
    <link rel='stylesheet' href='./assets/essential.css?<?php echo filemtime('./assets/essential.css'); ?>'>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
    </head>
    <body><?php
    if(!isset($_SESSION['data']['h'])){
        ?><div class='inpWrapper'>
        <input name='h' placeholder='Hostname' onkeyup='enter();' autocapitalize='none' autofocus>
        <span class="focus-border"></span>
        </div>
        <div class='inpWrapper'>
        <input name='u' placeholder='Username' onkeyup='enter();' autocapitalize='none'>
        <span class="focus-border"></span>
        </div>
        <div class='inpWrapper'>
        <input type='password' name='p' placeholder='Password' onkeyup='enter();' autocapitalize='none'>
        <span class="focus-border"></span>
        </div>
        <button onclick='login();'>Connect</button>
        </body>
        <foot>
        <script type="text/javascript" src="./assets/keymaster.js"></script>
        <script type="text/javascript" src="./assets/essential.js?<?php echo filemtime("./assets/essential.js");?>"></script>
        <script type="text/javascript" src="../files/js/notify.js?<?php echo filemtime("../files/js/notify.js");?>"></script>
        </foot>
        </html><?php
        exit();
    }
    if(!@ftp_chdir($conn,(!empty($_GET['dir']))?$_GET['dir']:"/public_html/files/")){
        ftp_chdir($conn,"/");
    }
    ?><!-- START MODAL -->
    <div id="modal" class="modal">
    <div class="modal-content">
    <div class="modal-header"><h2 id='title'></h2></div>
    <div class="modal-body"></div>
    <div class="modal-footer"></div>
    </div>
    </div>
    <!-- END MODAL -->
             <div class='bar actions'>
    <ul>
    <li><a onclick="showModal('newFile');"><i class="fas fa-plus"></i>&nbsp;File</a></li>
    <li><a><i class="fas fa-plus"></i>&nbsp;Folder</a></li>
    <!--<li><a class="nav-link disabled" aria-disabled="true" style="color:#6D757D"><i class="fas fa-copy"></i>&nbsp;'copy</a></li>-->
            <li><a><i class="fas fa-arrows-alt"></i>&nbsp;Move</a></li>
            <li><a><i class="fas fa-upload"></i>&nbsp;Upload</a></li>
            <li><a><i class="fas fa-download"></i>&nbsp;Download</a></li>
            <li><a><i class="fas fa-times"></i>&nbsp;Delete</a></li>
            <li><a onclick="showModal('rename');"><i class="fas fa-file"></i>&nbsp;Rename</a></li>
            <li><a><i class="fas fa-key"></i>&nbsp;Permissions</a></li>
            <li><a><i class="fas fa-cog"></i>&nbsp;Settings</a></li>
            <li><a href="./logout?l"><i class="fas fa-sign-out-alt"></i></i>&nbsp;Logout</a></li>
            <!--<a class="nav-link disabled" aria-disabled="true" style="color:#6D757D"><i class="fas fa-folder-open"></i>&nbsp;'extract</a>-->
                                                                                                                         <!--<a class="nav-link disabled" aria-disabled="true" style="color:#6D757D"><i class="fas fas fa-archive"></i>&nbsp;'compress</a>-->
            </ul>
        </div>
        <div class='left'>
            lapsum ipsum heeh hak hrs hahe seeing if this sidebar is working lappisu usbkenl unsbebdf
        </div>
        <div class='bar tools'>
            <ul>
                <li><a onclick="request('cd','/');"><i class="fas fa-home"></i>&nbsp;Home</a></li>
                <li><a onclick="request('up');"><i class="fas fa-level-up-alt"></i>&nbsp;Up One Level</a></li>
                <li><a><i class="fas fa-arrow-left"></i>&nbsp;Back</a></li>
                <li><a><i class="fas fa-arrow-right"></i>&nbsp;Forward</a></li>
                <li><a><i class="fas fa-sync"></i>&nbsp;Refresh</a></li>
                <li><a onclick="selectAll();"><i class="far fa-check-square"></i>&nbsp;Select All</a></li>
                <li><a onclick="unselectAll();"><i class="far fa-square"></i>&nbsp;Unselect All</a></li>
            </ul>
        </div>
        <table>
            <thead>
                <tr>
                    <th class='icon' rowspan="1" colspan="1"><span>&nbsp;</span></th>
                    <th class='name' rowspan="1" colspan="1"><span>Name</span></th>
                    <th rowspan="1" colspan="1"><span>Size</span></th>
                    <th rowspan="1" colspan="1"><span>Last Modified</span></th>
                    <th rowspan="1" colspan="1"><span>Type</span></th>
                    <th rowspan="1" colspan="1"><span>Permissions</span></th>
                </tr>
            </thead>
            <tbody><?php
                echoTableData()
            ?></tbody>
        </table>
    </body>
    <foot>
        <script type="text/javascript" src="./assets/keymaster.js"></script>
        <script type="text/javascript" src="./assets/essential.js?<?php echo filemtime("./assets/essential.js");?>"></script>
        <script type="text/javascript" src="../files/js/notify.js?<?php echo filemtime("../files/js/notify.js");?>"></script>
    </foot>
    </html><?php
    exit();
}else{
        switch($_POST['mode']){
            case 'cd':
                ftp_chdir($conn,$_POST['data']);
                echoTableData();
            break;
            case 'up':
                // // ftp_cdup($conn);
                // ftp_chdir($conn,"/public_html/files/");
                // echoTableData();
                // echo $pwd;
            break;
            case 'rename':
                ftp_rename($conn, explode(";;",$_POST['data'])[0], explode(";;",$_POST['data'])[1]);
                ftp_chdir($conn,ftp_pwd($conn));
                echoTableData();
            break;
            case 'md':
                ftp_rename($conn, explode(";;",$_POST['data'])[0], explode(";;",$_POST['data'])[1]);
                ftp_chdir($conn,ftp_pwd($conn));
                echoTableData();
            break;
            case 'newFile':
                $fp = fopen('php://temp', 'r+');
                fwrite($fp, "");
                rewind($fp);
                if(@ftp_fput($fconn, $pwd."/".$_POST['data'], $fp, FTP_ASCII)){
                echoTableData();
        }else{
           echo $pwd;
        }
        break;
    }
}

Файл Javscript:

const d = document;
let selectItems = [];
function selectItem(dir,elm){
    if(selectItems.find(function(item){if(item == dir){return true;}})){
        selectItems.splice(selectItems.indexOf(dir), 1);
    }else{
        if(!key["⌘"] && !key.control){
            Array.from(d.getElementsByClassName('selector')).forEach((item) => {
                let dir = item.getAttribute('dir');
                if(selectItems.find(function(item){if(item == dir){return true;}})){
                    item.classList.toggle('selected');
                }
            });
            selectItems = [];
        }
        selectItems.push(dir);
    }
    console.log(selectItems);
    elm.classList.toggle('selected');
}
const modal = d.getElementById('modal');
function showModal(x){
    var title = d.getElementById('title');
    var mBody = d.getElementsByClassName('modal-body')[0];
    var mFoot = d.getElementsByClassName('modal-footer')[0];
    switch(x){
        case 'rename':
            if(selectItems[0] !== undefined){
                var arr = selectItems[0].split('/');
                title.innerHTML = "Rename <i>"+selectItems[0]+"</i>";
                mBody.innerHTML = "<div class='inpWrapper'><input id='input' placeholder='Name' onkeyup='' autocapitalize='none' value='"+arr.pop()+"'><span class='focus-border'></span></div>";
                mFoot.innerHTML = "<button class='save-changes' id='saveBtn' onclick="+'"'+"request('rename','"+selectItems[0]+";;"+arr.toString().replace(/,/g, "/")+"/'+d.getElementById('input').value)"+'"'+">Rename</button><button class='close-modal' onclick='hideModal()'>Close</button>";
            }
        break;
        case 'newFile':
            title.innerHTML = "New file";
            mBody.innerHTML = "<div class='inpWrapper'><input id='input' placeholder='file.ext' onkeyup='' autocapitalize='none'><span class='focus-border'></span></div>";
            mFoot.innerHTML = "<button class='save-changes' id='saveBtn' onclick="+'"'+"request('newFile',d.getElementById('input').value)"+'"'+">Create</button><button class='close-modal' onclick='hideModal()'>Close</button>";
        break;
    }
    modal.style.display = "flex";
}
function hideModal(){
    modal.style.display = "none";
}
window.onclick = function(event){if(event.target == modal){hideModal();}};
function login(){
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function(){
        if(this.readyState == 4 && this.status == 200){
            notify(this.responseText.split(';;')[0], this.responseText.split(';;')[1]);
            if(this.responseText.split(';;')[1] == 'success'){location.reload();}
        }
    };
    xhttp.open("POST", "./login.php", true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send("h="+d.getElementsByTagName('input')[0].value+"&u="+d.getElementsByTagName('input')[1].value+"&p="+d.getElementsByTagName('input')[2].value);
}
function request(mode,data){
    var xhttp = new XMLHttpRequest();
    d.getElementsByTagName('tbody')[0].innerHTML = "<p style='margin:5px 0 0 5px;'><i class='fas fa-spinner'></i>&nbsp;Fetching directory contents</p>";
    xhttp.onreadystatechange = function(){
        if(this.readyState == 4 && this.status == 200){
            d.getElementsByTagName('tbody')[0].innerHTML = this.responseText;
        }
    };
    xhttp.open("POST", "./index.php", true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    var rData = (data === undefined)?"":data;
    xhttp.send("mode="+mode+"&data="+rData);
}
function enter(){
    const keyNum = (window.event.which)?window.event.which:window.event.keyCode;
    if(keyNum == 13){
        d.getElementsByTagName('button')[0].click();
    }
}
function selectAll(){
    Array.from(d.getElementsByClassName('selector')).forEach((item) => {
        let dir = item.getAttribute('dir');
        if(!selectItems.find(function(item){if(item == dir){return true;}})){
            selectItems.push(dir);
            item.classList.toggle('selected');
        }
    });
}
function unselectAll(){
    Array.from(d.getElementsByClassName('selector')).forEach((item) => {
        let dir = item.getAttribute('dir');
        if(selectItems.find(function(item){if(item == dir){return true;}})){
            item.classList.toggle('selected');
        }
    });
    selectItems = [];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...