Bonjour,
J'ai un problème lié aux fichiers et à l'os Mac.
Dans mon code, je récupère un fichier dans un formulaire et je le met sur mon FTP. Ensuite je crée un fichier texte, j'écris dedans, puis je l'enregistre.
Voici mon code :

<?php
session_start();
if(!isset($_SESSION["User"])){
    header("Location: ./");
}
if(!isset($_SESSION["niveau"])){
    header("Location: panel.php");
}

if(isset($_POST) && !empty($_POST) && isset($_POST["submit"]) && isset($_FILES['image']) && isset($_POST["reponse"])){
    $uploaddir = "../images/".$_SESSION["niveau"]."/";
    $uploadfile = $uploaddir . basename($_FILES['image']['name']);
    if(!move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile))
        echo 'erreur';
    $path=pathinfo($uploadfile);
    $monfichier = fopen($uploaddir.$path["filename"].'.txt', 'a+');
    fputs($monfichier,stripslashes($_POST["reponse"]));
    fclose($monfichier);
    header("Location: list.php");
}
?>
<!DOCTYPE HTML>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="../css/style.css">
    <link rel="stylesheet" type="text/css" href="../css/zoombox.css">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

<body>

    <div id="content">
        <h1>Ajouter une question...</h1>
        <br />
        <div class="imageadeviner">
            <form action="" method="post" enctype="multipart/form-data">
                <input type="file" name="image" accept="image/*" />
                <br /><br />
                <label for="reponse">La réponse:</label>
                <input type="text" name="reponse" id="reponse" />
                <div class="action">
                    <input type="submit" name="submit" value="+ Ajouter" />
                </div>
            </form>
            <a class="button" href="list.php">Retour &#x21ba;</a>
        </div>
    </div>

</body>

</html>

Tout ce code fonctionne lorsque je le fais depuis mon Windows. Mais mon client ne possède qu'un mac. Je précise que le problème ne vient pas de safari puisque avec firefox non plus cela ne fonctionne pas.
Si vous pouvez me dire quoi faire, je vous serez très reconnaissant.

Merci d'avance.

10 réponses


Lartak
Réponse acceptée

Bonjour.
Pour commencer, les séparateurs de dossiers (directory separator) ne sont pas les mêmes entre Windows et les autres OS.
Pour faire simple, sur Windows c'est le slash : /, alors que sur les autres c'est l'anti-slash : \.
Donc, je te conseille de créer une constante et de l'utiliser à la place de mettre le slash, par exemple dans un fichier de ton site qui est incluse à chaque fois, comme un fichier de constante ou de fonction :

define('DS', DIRECTORY_SEPARATOR);

Ensuite, dans ton code, par exemple :

$uploaddir = '..' . DS . 'images' . DS . $_SESSION["niveau"] . DS;

Ensuite, vérifies si ce n'est pas un problème de droit d'écriture et si c'est le cas, il te faut modifier le chmod à la création du fichier.

LesTutossUE4
Auteur
Réponse acceptée

C'est bien l'histoire avec le / et le \. Merci Lartak.

Il suffit simplement de faire ça ? :

if(isset($_POST) && !empty($_POST) && isset($_POST["submit"]) && isset($_FILES['image']) && isset($_POST["reponse"])){
    $uploaddir = "..".DS."images".DS.$_SESSION["niveau"].DS;
    $uploadfile = $uploaddir . basename($_FILES['image']['name']);
    if(!move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile))
        echo 'erreur';
    $path=pathinfo($uploadfile);
    $monfichier = fopen($uploaddir.$path["filename"].'.txt', 'a+');
    fputs($monfichier,stripslashes($_POST["reponse"]));
    fclose($monfichier);
    header("Location: list.php");
}

Si c'est ça je ne comprend pas car ça se passe sur le serveur et non sur l'ordinateur de l'utilisateur...

Si c'est ça je ne comprend pas car ça se passe sur le serveur et non sur l'ordinateur de l'utilisateur...

Quel est le rapport avec ça alors ? :

Tout ce code fonctionne lorsque je le fais depuis mon Windows. Mais mon client ne possède qu'un mac.

Es-tu sûr que ton client ne dépasse pas la taille limite du serveur ?
as-tu vérifié post_max_size et max_file_uploads dans ton php.ini ?

Non, mais ce n'est pas le problème, je l'ai tester moi même sur un mac avec une image d'à peine 1mo et rien ne marche.
Je n'ai pas tester avec les DIRECTORY_SEPARATOR mais j'attend qu'on me dise si c'est bien ça avant de redemander à un ami de me pretter son mac.

Quel est le rapport avec ça alors ? :
Bah le rapport c'est que sur windows l'envoi fonctionne, alors que sur mac, non.

Bizarre ton problème !!!
sous mac comme sous Linux c'est bien '/' mais sous windows le '/' marche aussi
ça m'intéresse de savoir comment tu as résolu ton problème et pourquoi tu envoies des chemins sur le réseau.

J'ai remplacé uniquement la ligne

  $uploaddir = "../images/".$_SESSION["niveau"]."/";

par

$uploaddir = "..".DS."images".DS.$_SESSION["niveau"].DS;

Avec la ligne suivante au tout début évidemment :

define('DS', DIRECTORY_SEPARATOR);

De rien.
Ravi d'avoir pu t'aider à solutionner ton problème.