Accès ftp

ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006 - 26 oct. 2006 à 14:39
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006 - 27 oct. 2006 à 12:25
Bonjour à tous,


j'ai mis une petite zone pour un accès ftp sur mon site
(www.3d-upside-down.com) pour que mes clients puissent downloader des
fichiers personnels mis à leur disposittion. J'ai donc créé une petite
page php avec ce code :

<?

$user = $_POST['user'];

$password = $_POST['password'];

$adresse = "ftp://"."$user".":"."$password"."@ftp.3d-upside-down.com";

header("Location:$adresse");

?>

Sous firefox, le dossier s'affiche bien, mais downloader un fichier
mène (parfois) à un "access denied". Sous IE, je suis obligé de
recharger la page manuellement pour que le dossier s'affiche.

Une idée? (possibilité de tester avec user : public et password : public


Merci d'avance,


yan

12 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 oct. 2006 à 15:44
Hello,

pourquoi tu n'utilises pas les fonctions ftp de php ?
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006
26 oct. 2006 à 15:58
salut malalam,

tu parles des ftp_open() &co? j'ai essayé, j'ouvre bien la session, mais je n'arrive pas à afficher le contenu du dossier ftp, et encore moins à rendre son contenu téléchargeable. Mais peut-être suis-je un peu trop vaniteux de vouloir demander autant avec mon petit niveau en php?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 oct. 2006 à 16:31
Un exemple de mini mini ftp que je me suis monté à l'arrache. Il faut changer les constantes (définir les tiennes plutôt), évidemment.

<?php
require_once 'inc/inc.main.php';$sCmd $sLocalExp $sLocalImp = '';
$aForbid = array ('.', '..');

$rCon = @ftp_connect (FTP_HOST);
if (false === $rCon) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_CONNECT_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_CONNECT_LOG);
}
if (false === @ftp_login ($rCon, FTP_LOGIN, FTP_PWD)) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_LOGIN_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_LOGIN_LOG);
}

if (false === @ftp_pasv($rCon, true )) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_PASV_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_PASV_LOG);
}

if (empty ($_POST['dir'])) {
    $_POST['dir'] = '/';
}
if (empty ($_POST['upload'])) {
    $_POST['upload'] = '';
}

if (false === @ftp_chdir ($rCon, $_POST['dir'])) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_CHDIR_ERROR.' '.$_POST['dir'].'');
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_CHDIR_LOG.' '.$_POST['dir'].'');
}

if (isset ($_POST['act']) && !empty ($_POST['act'])) {
    switch ($_POST['act']) {
        case 1 :
            if (false === @ftp_get ($rCon, 'imported/'.$_POST['upload'], $_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
        case 2 :
            if (false === @ftp_put ($rCon, 'retour_commande/'.$_POST['upload'], 'exports_ogilvy/'.$_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
        case 3 :
            if (false === @ftp_put ($rCon, 'stock/'.$_POST['upload'], 'exports_ogilvy/'.$_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
    }
}

$sCurDir = @ftp_pwd ($rCon);

$aContents = @ftp_nlist($rCon, $sCurDir);
if (false === $aContents) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_DIR_ERROR.' '.$sCurDir.'');
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_DIR_LOG.' '.$sCurDir.'');
    $sCmd .= 'REPERTOIRE : '.$sCurDir.'';
    foreach ($aContents as $sCont) {
        $sCmd .= <<<HTML
            <li>{$sCont} [UP]</li>
HTML;
    }
    $sCmd .= '';
}

$aExport = scandir ('exports');
$aImport = scandir ('imported');
$aExport = array_diff ($aExport, $aForbid);
$aImport = array_diff ($aImport, $aForbid);
$sLocalExp .= 'REPERTOIRE : EXPORTS';
foreach ($aExport as $sFile) {
    if (strpos ($sFile, 'art')) {
        $iJs = 3;
    } elseif (strpos ($sFile, 'cmd')) {
        $iJs = 2;
    }
    $sLocalExp .= <<<HTML
        <li>{$sFile} [UP]</li>
HTML;
}
$sLocalExp .= '';
$sLocalImp .= 'REPERTOIRE : IMPORTS';
foreach ($aImport as $sFile) {
    $sLocalImp .= <<<HTML
        <li>{$sFile} [UP]</li>
HTML;
}
$sLocalImp .= '';

ftp_close ($rCon);
?>

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>XXXXXX</title>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <link rel="stylesheet" type="text/css" href="<?php echo PATH_CSS; ?>main.css" />
    <script type="text/javascript">
        function go (sForm, sVal, iMode) {
            with (document.getElementById (sForm)) {
                act.value = iMode;
                switch (iMode) {
                    case 0 :
                        dir.value = sVal;
                        upload.value = '';
                        break;
                    case 1 :
                        upload.value = sVal;
                        break;
                    case 2 :
                        upload.value = sVal;
                        break;
                    case 3 :
                        upload.value = sVal;
                        break;
                }
                submit ();
            }
        }
    </script>
    </head>
   
        <form method="post" action="" id="mainForm">
           
               
                " />
                " />
           

        </form>
       

            Reconnexion
       

       

           
                FTP
           

           
                <?php echo $sCmd; ?>
           

       

       

           
                LOCAL
           

           
                <?php echo $sLocalExp; ?>
           

           
                <?php echo $sLocalImp; ?>
           

       

       

            LOG

           
            <?php
                if (!empty ($aMsg)) {
                    foreach ($aMsg as $aMes) {
                        if (0 === $aMes['TYPE']) {
                            echo '- ',$aMes['MSG'],'
';
                        } else {
                            echo '- ',$aMes['MSG'],'
';
                        }
                    }
                }
            ?>
           

       

   
</html>
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006
26 oct. 2006 à 17:01
à l'arrache? je sais dire "merci" en chinois, et tu me récites Confucius en version originale...
J'ai 3 constantes, server, user et password... je mets ça où dans ton code?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 oct. 2006 à 17:39
$rCon = @ftp_connect (FTP_HOST);
c'est le serveur

ftp_login ($rCon, FTP_LOGIN, FTP_PWD)
c'est le login et le pwd.

(t'as pas bcp regardé...)
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006
26 oct. 2006 à 18:05
oui, une fois que tu le montres, c'est simple, autrement, c'était perdu au milieu de 1000 variables...
Bon, je suis désolé de passer encore pour un assisté, mais je n'obtiens qu'une page blanche, quels que soient les user/password que je rentre.
Mon fichier "verif.php" a cette tête (et je te paie un coup dès que tu passes par Bombay) :

<?
$user = $_POST['user'];
$password = $_POST['password'];

require_once 'inc/inc.main.php';$sCmd $sLocalExp $sLocalImp = '';
$aForbid = array ('.', '..');

$rCon = @ftp_connect ('ftp.3d-upside-down.com');
if (false === $rCon) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_CONNECT_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_CONNECT_LOG);
}
if (false === @ftp_login ($rCon, $user, $password)) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_LOGIN_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_LOGIN_LOG);
}

if (false === @ftp_pasv($rCon, true )) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_PASV_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_PASV_LOG);
}

if (empty ($_POST['dir'])) {
    $_POST['dir'] = '/';
}
if (empty ($_POST['upload'])) {
    $_POST['upload'] = '';
}

if (false === @ftp_chdir ($rCon, $_POST['dir'])) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_CHDIR_ERROR.' '.$_POST['dir'].'');
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_CHDIR_LOG.' '.$_POST['dir'].'');
}

if (isset ($_POST['act']) && !empty ($_POST['act'])) {
    switch ($_POST['act']) {
        case 1 :
            if (false === @ftp_get ($rCon, 'imported/'.$_POST['upload'], $_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
        case 2 :
            if (false === @ftp_put ($rCon, 'retour_commande/'.$_POST['upload'], 'exports_ogilvy/'.$_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
        case 3 :
            if (false === @ftp_put ($rCon, 'stock/'.$_POST['upload'], 'exports_ogilvy/'.$_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
    }
}

$sCurDir = @ftp_pwd ($rCon);

$aContents = @ftp_nlist($rCon, $sCurDir);
if (false === $aContents) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_DIR_ERROR.' '.$sCurDir.'');
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_DIR_LOG.' '.$sCurDir.'');
    $sCmd .= 'REPERTOIRE : '.$sCurDir.'';
    foreach ($aContents as $sCont) {
        $sCmd .= <<<HTML
            <li>{$sCont} [UP]</li>
HTML;
    }
    $sCmd .= '';
}

$aExport = scandir ('exports');
$aImport = scandir ('imported');
$aExport = array_diff ($aExport, $aForbid);
$aImport = array_diff ($aImport, $aForbid);
$sLocalExp .= 'REPERTOIRE : EXPORTS';
foreach ($aExport as $sFile) {
    if (strpos ($sFile, 'art')) {
        $iJs = 3;
    } elseif (strpos ($sFile, 'cmd')) {
        $iJs = 2;
    }
    $sLocalExp .= <<<HTML
        <li>{$sFile} [UP]</li>
HTML;
}
$sLocalExp .= '';
$sLocalImp .= 'REPERTOIRE : IMPORTS';
foreach ($aImport as $sFile) {
    $sLocalImp .= <<<HTML
        <li>{$sFile} [UP]</li>
HTML;
}
$sLocalImp .= '';

ftp_close ($rCon);
?>

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>XXXXXX</title>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <link rel="stylesheet" type="text/css" href="<?php echo PATH_CSS; ?>main.css" />
    <script type="text/javascript">
        function go (sForm, sVal, iMode) {
            with (document.getElementById (sForm)) {
                act.value = iMode;
                switch (iMode) {
                    case 0 :
                        dir.value = sVal;
                        upload.value = '';
                        break;
                    case 1 :
                        upload.value = sVal;
                        break;
                    case 2 :
                        upload.value = sVal;
                        break;
                    case 3 :
                        upload.value = sVal;
                        break;
                }
                submit ();
            }
        }
    </script>
    </head>
   
        <form method="post" action="" id="mainForm">
           
               
                " />
                " />
           

        </form>
       

            Reconnexion
       

       

           
                FTP
           

           
                <?php echo $sCmd; ?>
           

       

       

           
                LOCAL
           

           
                <?php echo $sLocalExp; ?>
           

           
                <?php echo $sLocalImp; ?>
           

       

       

            LOG

           
            <?php
                if (!empty ($aMsg)) {
                    foreach ($aMsg as $aMes) {
                        if (0 === $aMes['TYPE']) {
                            echo '- ',$aMes['MSG'],'
';
                        } else {
                            echo '- ',$aMes['MSG'],'
';
                        }
                    }
                }
            ?>
           

       

   
</html>

?>
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006
26 oct. 2006 à 18:11
PS : j'ai enlevé la partie à partir de <?xml... car je pense que c'est la partie entrée, non?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 oct. 2006 à 18:14
On continuera demain, désolé, ou quelqu'un prendra la relève.
Néanmoins, ton serveur est configuré en short_open_tags = On, donc, modifie déjà ça :
<?xml version="1.0" encoding="ISO-8859-1"?>
=>
echo '<?xml version="1.0" encoding="ISO-8859-1"?>';

Ensuite, ce script utilise quelques fonctions PHP5, à changer si tu es en PHP4 (scandir () par exemple).

A demain ;-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 oct. 2006 à 18:15
PS : j'ai enlevé la partie à partir de <?xml... car je pense que c'est la partie entrée, non?

voui
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006
26 oct. 2006 à 18:32
OK, merci en tout cas. Et mon PHP est version 5.
A+
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 oct. 2006 à 08:16
Bon on reprend :
$aExport = scandir ('exports');
$aImport = scandir ('imported');
$aExport = array_diff ($aExport, $aForbid);
$aImport = array_diff ($aImport, $aForbid);
$sLocalExp .= 'REPERTOIRE : EXPORTS';
foreach ($aExport as $sFile) {
    if (strpos ($sFile, 'art')) {
        $iJs = 3;
    } elseif (strpos ($sFile, 'cmd')) {
        $iJs = 2;
    }
    $sLocalExp .= <<<HTML
       
<li>{$sFile} [UP]</li>
HTML;
}
$sLocalExp .= '';
$sLocalImp .= 'REPERTOIRE : IMPORTS';
foreach ($aImport as $sFile) {
    $sLocalImp .= <<<HTML
       
<li>{$sFile} [UP]</li>
HTML;
}
$sLocalImp .= '';

cette partie affiche une partie locale : donc, à priori, tu n'en as pas besoin. Ou alors faut changer les répertoires lus.

En reprenant du haut :
$rCon = @ftp_connect ('ftp.3d-upside-down.com');
if (false === $rCon) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_CONNECT_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_CONNECT_LOG);
}
if (false === @ftp_login ($rCon, $user, $password)) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_LOGIN_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_LOGIN_LOG);
}

if (false === @ftp_pasv($rCon, true )) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_PASV_ERROR);
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_PASV_LOG);
}
ici, je me connecte, je me logge, je me mets en mode passif.
Je logge les erreurs...dans un tableau, en récupérant des constantes représentant les messages d'erreurs. Faut définir ces constantes.

if (empty ($_POST['dir'])) {
    $_POST['dir'] = '/';
}
if (empty ($_POST['upload'])) {
    $_POST['upload'] = '';
}
ça, c'est pour le formulaire d'upload et de changement de répertoire sur le ftp. Par défaut, je me place à la racine.

if (false === @ftp_chdir ($rCon, $_POST['dir'])) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_CHDIR_ERROR.' '.$_POST['dir'].'');
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_CHDIR_LOG.' '.$_POST['dir'].'');
}
ça, c'est pour me placer sur le répertoire choisi.

if (isset ($_POST['act']) && !empty ($_POST['act'])) {
    switch ($_POST['act']) {
        case 1 :
            if (false === @ftp_get ($rCon, 'imported/'.$_POST['upload'], $_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
        case 2 :
           
if (false === @ftp_put ($rCon, 'retour_commande/'.$_POST['upload'],
'exports_ogilvy/'.$_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
        case 3 :
            if (false === @ftp_put ($rCon, 'stock/'.$_POST['upload'], 'exports_ogilvy/'.$_POST['upload'], FTP_BINARY)) {
                $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_GET_ERROR.' '.$_POST['upload'].'');
            } else {
                $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_GET_LOG.' '.$_POST['upload'].'');
            }
            break;
    }
}

ça, c'est la gestion des upload.

$sCurDir = @ftp_pwd ($rCon);

$aContents = @ftp_nlist($rCon, $sCurDir);
if (false === $aContents) {
    $aMsg[] = array ('TYPE' => 0, 'MSG' => FTP_DIR_ERROR.' '.$sCurDir.'');
} else {
    $aMsg[] = array ('TYPE' => 1, 'MSG' => FTP_DIR_LOG.' '.$sCurDir.'');
    $sCmd .= 'REPERTOIRE : '.$sCurDir.'';
    foreach ($aContents as $sCont) {
        $sCmd .= <<<HTML
           
<li>{$sCont} [UP]</li>
HTML;
    }
    $sCmd .= '';
}
là, je répère le répertoire sur lequel je suis, puis je lis son contenu pour l'afficher.

Dans le html, tu as une fonction js gérant les clicks (sur quoi je clique, quoi).
Et surtout, l'affichage des variables déclarées en haut et stockant mes affichages : répertoires, etc. Aucun affichage ne se fait dans la partie du haut.

Dernier conseil, fous toi en error_reporting (E_ALL);, soit via cette fonction, soit dans ton php.ini. Ca aide quand même à debugger...
ygarin Messages postés 7 Date d'inscription jeudi 26 octobre 2006 Statut Membre Dernière intervention 27 octobre 2006
27 oct. 2006 à 12:25
Je suis complètement largué... Je crois que je veux quelque chose de trop compliqué pour mon petit niveau, et que je te fais perdre ton temps.
J'ai essayé tout ça dans tous les sens, page blanche... Merci d'avoir essayé en tout cas.

A+

yan
Rejoignez-nous