Bonjour,

J'ai un soucis avec mon code, en effet, j'ai mit en place une gestion d'upload de fichiers qui fonctionne très bien en local dans le test mais qui une fois en ligne sur un serveur sous debian, celui ci ne fonctionne plus.

On visualise très bien les fichiers présents dans le dossier de stockage, mais on peut pas uploader un fichier, et je ne sais pas où c'est.

Voici mes deux fichiers (c'est du pu procédurale, ça sera améliorer par la suite, l'idée c'était de dev un espace de gestion pour avoir une base que j'améliorerais dans le temps.)

stockage.php

<?php
/*
Programme par : kiki67100
le mardi 27 novembre 2007
Mis à jour et modifié par Frez69 le 08/08/2019
*/

$i = null;
$dossier = (preg_match("@^(?:personal)@i", $d))?'./stockage/'.$user_pseudo.'/':'./stockage/';
$textFile = (preg_match("@^(?:personal)@i", $d))?'dans mon éspace':'dans l\'éspace familliale';
$urlretour = (preg_match("@^(?:personal)@i", $d))?'./index.php?d=personal&p=stockage':'./index.php?p=stockage';
// $dossier = './stockage/';
$nb_fichier = 0;

if(isset($dossier)&&!empty($dossier)&&file_exists($dossier)&&is_dir($dossier))/*Verifie la variable et bien un repertoire*/
{
    $rep=$dossier;
    $rep=str_replace("//","/",$rep);
    $handle = @opendir($rep);/* Ouvre le repertoire */
    if(!$handle)
      {
        Erreur('Erreur l\'ors de l\'ouverture de '.$rep.' !');
        exit;
    }
}
$action = isset($_GET['action'])?$_GET['action']:'';
switch ($action) {
/*uploader*/
    case "uploader":
        include ('uploadfile.php');
        break;
/*renommer*/
    case "renommer":
        include ('renamefile.php');
        break;
/*telecharger*/
    case "telecharger":
        include ('telechargerfile.php');
        break;
/*supprimer*/
    case "delet":
        include ('deletfile.php');
        break;
/*par défaut*/
    default:
?>
    <div class="mt-2"></div>
        <table class="table table-striped">
            <tbody>
<?php
ob_start();
    while ($f = readdir($handle)) { //Boucle qui enumere tout les fichier d'un repertoire
         // On incrémente le compteur de 1
        $lien=str_replace(" ",'%20',$f); /*Pour les espace fichier*/
        $replien=str_replace(" ",'%20',$rep);/*idem pour les dossier*/

        if(@is_dir($rep.'/'.$f)){ /*verifie si c'est un repertoire*/
            // echo '<a href="?dir='.$replien.'/'.$lien.'"><i class="   fas fa-folder-open"></i>'.$f.'</a><br />'; 
        }elseif(@is_file($rep.'/'.$f)){/*Verifie si c'est bien un fichier*/
            $nom=strrchr($f,'.');
            $extension=substr($nom,1);
            if($extension=="txt" || $extension=="doc" || $extension=="docx"|| $extension=="pdf")
            {
                $nb_fichier++;
                $fullurl = $replien.$f;
                $modal = '<a class="files viewPdf text-info" data-toggle="modal" data-target="#viewPdfModal" data-id="'.$fullurl.'" class="viewPdf" title="Apperçu"><i class="fas fa-search-plus"></i>';
                if ($extension=="txt"){
                    $ico = '<span class="fas fa-file-alt text-info"></span>';
                }
                if ($extension==="pdf"){
                    $ico = '<span class="fas fa-file-pdf text-danger"></span>';
                }
                if ($extension==="doc" || $extension=="docx"){
                    $ico = '<span class="fas fa-file-word text-primary"></span>';
                    $modal = '<i class="fas fa-search-plus text-muted"></i>';
                }
?>
                <tr>
                    <th scope="row"><i class=""><?= $ico.' '.$extension; ?></i></th>
                    <td><a><?= $f; ?><a></td>
                    <td><?= $modal; ?></td>
                    <td><a class="text-success" href="./index.php?p=stockage&action=telecharger&fichier=<?= $f; ?>" title="Télécharger"><i class="fas fa-download"></i></td>
                    <td><a class="files text-warning renameFile" data-toggle="modal" data-target="#renameFileModal" data-id="<?= $f ?>" title="Renommer"><i class="fas fa-edit"></i></a></td>
                    <td><a class="files text-danger deletFile" data-toggle="modal" data-target="#deletFileModal" data-id="<?= $f ?>" title="Supprimer"><i class="fas fa-trash"></i></a></td>
                </tr>
<?php
            } // fin if
        }
    } // fin while

    if ($nb_fichier===0){
?>
                <tr>
                    <th class="border-bottom-danger bg-gray-200 text-gray-700 text-center" scope="row">Aucun fichier <?= $textFile ?></th>
                </tr>
<?php
    }
    $content = ob_get_clean();
    if ($nb_fichier!=0){
        $s = ($nb_fichier>1)?'fichiers':'fichier';
?>
                <tr>
                    <th class="border-bottom-primary bg-gray-200 text-gray-700 text-center" colspan="6">Il y'a <?= $nb_fichier.' '.$s ?> <?= $textFile ?>.</th>
                </tr>
<?php
    }
    echo $content;
?>
            </tbody>
        </table>
<?php
    break;
}

uploadfile.php

<?php
function check_extension($ext,$ext_aut)
{
    if(in_array($ext,$ext_aut))
    {
        return true;
    }
}
if(!empty($_FILES))
{
    // $dossier=$dossier;
    $result_ext = '';
    $result_max = '';
    $result_valid = '';
    $result_upload = '';
    $redirect = false;
    if(is_array($_FILES)) 
    {
        foreach ($_FILES['fichier']['name'] as $name => $value) 
        {
            $valid_ext = false;
            $valid_max = false;
            $valid_valid = false;
            $file = $_FILES['fichier'];
            $fichier = explode(".", $_FILES['fichier']['name'][$name]);
            $fichier_name = basename(strtolower($_FILES['fichier']['name'][$name]));
            $ext = explode(".", strtolower($_FILES['fichier']['name'][$name]));

            $SourcePath = $_FILES['fichier']['tmp_name'][$name]; 
            $TargetPath = $dossier.$fichier_name;
            $extension_name = array('pdf','doc','docx','txt');

            $valid_ext .= (check_extension($ext[1],$extension_name)) ? true : false;
            $result_ext .= (!check_extension($ext[1],$extension_name)) ? '<p class="text-danger">L\'extention du fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " n\'est pas valide</p>' : '';

            $valid_max .= ($file['size']>900000) ? true : false;
            $result_max .= ($file['size']>900000) ? '' : '<p class="text-danger">Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " est trop gros</p>';

            $valid_valid .= ($file['error']>0) ?  true : false;
            $result_valid .= ($file['error']>0) ? '' : '<p class="text-danger">Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " n\'est pas valide</p>';
            var_dump($file['error']);
            // exit;   ( ! ) Notice: Undefined variable: nom in C:\wamp64\www\identifiants\content\uploadfile.php on line 53

            if($valid_ext && $valid_max && $valid_valid) 
            {
                if(move_uploaded_file($SourcePath, $TargetPath)){

                    $result_upload .= '<p>Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " est bien uploadé</p>';
                    $redirect = true;
                }
                else{
                    $result_upload .= '<p>Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " n\'a pas été uploadé</p>';
                    $redirect = false;
                }
            }
        }
    }
?>
            <div class="alert alert-info" role="alert">
                <h3 class="alert-heading">Resultat des téléchargements</h3>
                <?= $result_ext ?>
                <?= $result_max ?>
                <?= $result_valid ?>
                <?= $result_upload ?>
<?php
                if ($redirect){
?>
                <hr>
                <script type="text/javascript">
                    document.write('<p class="mb-0">Redirection automatique dans 3 secondes</p>');
                    window.setTimeout("location=('<?= $urlretour; ?>');",3000);
                </script>
                <noscript>
                    <p class="mb-0">
                        <a class="alert-link" class="text-light" href="<?= $urlretour; ?>">Revenir à la lite de mes fichiers.</a>
                    </p>
                </noscript>
<?php
                }
?>
            </div>
<?php
}

else{
?>
        <form action="" method="post" enctype="multipart/form-data">
            <div class="input-group">
                <div class="custom-file">
                    <input type="file" class="custom-file-input" id="inputGroupFile" name="fichier[]" multiple="multiple" required accept=".pdf,.doc,.docx,.txt" onchange="drop();"/>
                    <label class="custom-file-label" id="fileLabel" for="inputGroupFile">Sélectionner le(s) fichier(s)</label>
                </div>
                <div class="input-group-append">
                    <button type="submit" class="btn btn-primary btn-small">Télécharger</button>
                </div>
            </div>
        </form>
<?php
}
?>

Voila, je sais pas pourquoi en local cela fonctionne, alors qu'en ligne plus rien.

Merci à vous de votre aide.

Bien cordialement.

4 réponses


Lardio
Réponse acceptée

Peut-etre un probleme cote serveur - le user utilise par ton service web a les droits d'ecriture sur le dossier de reception ?

Cdlt

Fre3z69
Auteur

Salut, en effet, c'est une question de droit, j'ai mit 750 sur les dossier d'upload et cela fonctionne.

Du coup, lors dans la fonction qui initialise l'ouverture des dossiers en vérifiant que ceux ci existent, j'ai rajouter une condition qui véfiie les droits, si pas égale à 750 alors ça les mets à 750.

Mais je rebondis sur cette problématique résolue pour demander ceci: Comment on créer un répertoire par contre avec les bons droits?
J'aimerais si le dossier n'existe pas, le créer avec ses droits à 75.

PS: Info pour l'équipe qui gére le forum: Lors de la création du topic, j'ai été coincé sur la page d'édition, malgré que j'avais tout renseigner.
De ce fait, je ne savais pas si mon sujet à été créé ou pas. Je reléve cela, en éspérant que ça sera réglé, si c'est un vrai soucis.

si j'ai bien compris tu es sous Debian - donc quand tu vas creer un repertoire, ca va reprendre les droits definis dans ton umask.
Tu peux le verifier avec la commande "umask".
Tu peux modifier les droits de ton repertoire avec la commande chmod 750 <ton_repertoire>.
Sinon tu cree ton repertoire en indiquant les droits lors de la creation => mkdir –m750 <ton_repertoire>
[edit] Si la question concerne la creation de repertoire cote Linux bine sur

Cdlt

Fre3z69
Auteur

Super. en effet j'ai donné les droits en ligne de commande mais c'est pas évident. Si il faut que je crée un utilisateur alors il faudra en effet créer le répertoire et lui accorder les accès. En tout cas merci à toi.

Le sujet est je penses résolu.

Bien cordialement.