Page 1 sur 3

[résolu] Upload de fichiers (merci bcp)

Posté : 11 juin 2005, 19:33
par boby79
Salut a tous, je suis nouveau ici et deja je sens que vous allez beaucoup m'aider :?

donc j'aimerais mettre en place un upload de photos sur mon site, j'ai suivi a la lettre ce tuto : http://www.phpfrance.com/tutoriaux/inde ... e-fichiers

Et ca ne marche pas, mon dossier photos reste vide

Voici le fichier form.htm

Code : Tout sélectionner

<html> <body> <!-- Erreur ? --> <?php if(isset($erreur)){ echo '<p>',</p>'; } ?> <!-- Formulaire --> <!-- Attention, ne de ne pas oublier le enctype="multipart/form-data" --> <form method="POST" action="upload.php" enctype="multipart/form-data"> <!-- Limiter la taille des fichiers à 500Ko --> <input type="hidden" name="MAX_FILE_SIZE" value="500000" /> <fieldset> <legend>Envoi de fichiers</legend> <!-- champs d'envoi de fichier, de type file --> <p><label for="photo">Photo :</label><input type="file" name="photo" /></p> <p><label for="photo_2">Photo 2 :</label><input type="file" name="photo_2" /></p> <!-- bouton d'envoi --> <p><input type="submit" name="envoi" value="Envoyer les fichiers" /></p> </fieldset> </form> </body> </html>
et le fichier upload.php

Code : Tout sélectionner

<?php if(isset($_FILES['photo'])) { // params unset($erreur); $extensions_ok = array('png', 'gif', 'jpg', 'jpeg'); $taille_max = 100000; $dest_dossier = '/photos/'; // vérifications if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) ) { $erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !'; } elseif( file_exists($_FILES['photo']['tmp_name']) and filesize($_FILES['photo']['tmp_name']) > $taille_max) { $erreur = 'Votre fichier doit faire moins de 500Ko !'; } // copie du fichier if(!isset($erreur)) { $dest_fichier = basename($_FILES['photo']['name']); // formatage nom fichier // enlever les accents $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); // remplacer les caracteres autres que lettres, chiffres et point par _ $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier); // copie du fichier move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier); } } ?>
Ou y'a-t-il une erreur ? j'ai oublié quelquechose ?

Merci de m'aider car je suis dans une impasse

A bientot :D

Posté : 11 juin 2005, 19:37
par Cyrano
Tu n'es pas le premier à qui ça arrive et la réponse a été donnée il n'y a pas longtemps: fais une petite recherche dans les archives du forum avec "upload fichier", tu vas trouver pas mal de choses.

Posté : 11 juin 2005, 19:38
par boby79
A oui, j'avais oublié de préciser que j'ai éffectué une recherche au préalable et ca ne m'a pas éclairé plus que cela, je vais tenter de (re)chercher.

Merci quand meme :wink:

Posté : 11 juin 2005, 19:49
par boby79
:( Bon, je trouve vraiment pas quelquechose de bien a me mettre sous la dent, un petit peu d'aide me serait vraiment utile. :agenouille:

Je ne demande qu'on me fasse le boulot mais au moins que l'on m'aide un petit peu :)

A bientot

Posté : 11 juin 2005, 21:26
par ouckileou
est-ce que le dossier de destination à les droits en écriture ?

je vois que tu fais aussi un test sur l'extension, alors que tu as un champ 'type' dans le tableau $_FILES qui serait sans doute plus approprié

Posté : 11 juin 2005, 21:39
par Cyrano
Ok, alors voici ces deux même fichiers avec quelques corrections. Les explications suivent:
Le formulaire
<html>
<body>
<!-- Erreur ? -->
<?php
if(isset($erreur))
{
    echo "<p>Erreur : ". $erreur ."</p>";
}
?>
<!-- Formulaire -->
<!-- Attention, ne de ne pas oublier le  enctype="multipart/form-data" -->
<form method="POST" action="upload.php" enctype="multipart/form-data">
  <!-- Limiter la taille des fichiers à 500Ko -->
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
<fieldset>
<legend>Envoi de fichiers</legend>
<!-- champs d'envoi de fichier, de type file -->
<p><label for="photo">Photo :</label><input type="file" name="photo" /></p>
<p><label for="photo_2">Photo 2 :</label><input type="file" name="photo_2" /></p>
<input type="hidden" name="taille_max" value="500000" />
<!-- bouton d'envoi -->
<p><input type="submit" name="envoi" value="Envoyer les fichiers" /></p>
</fieldset>
</form>
</body>
</html>
Le traitement
<?php
if(isset($_FILES['photo']))
{
    // params
    unset($erreur);
    $extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
    $taille_max = $_POST['taille_max'];
    $dest_dossier = '/photos/';
    // vérifications
    if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
    {
        $erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';
    }
    elseif( file_exists($_FILES['photo']['tmp_name']) && $_FILES['photo']['size'] > $taille_max)
    {
        $erreur = "Votre fichier doit faire moins de ". $taille_max / 1024 ." Ko !";
    }
    // copie du fichier
    if(!isset($erreur))
    {
        $dest_fichier = basename($_FILES['photo']['name']);
        // formatage nom fichier
        // enlever les accents

        $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
        // remplacer les caracteres autres que lettres, chiffres et point par _
        $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
        // copie du fichier
        if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier))
        {
            echo("<p>Le fichier a été correctement chargé dans son répertoire.</p>\n");
        }
        else
        {
            echo("<p>Une erreur s'est produite : Le fichier n'a pas été correctement chargé.</p>\n");
        }
    }
}

?>
J'ai corrigé dans le formulaire un début de PHP qui avait une apostrophe exédentaire au milieu qui mettait un peu la zone.

Ensuite dans la partie traitement, j,ai modifié la récupération de la taille en utilisant directement un des index de la variable $_FILES. Pour simplifier, j'ai également ajouté un champ caché dans le formulaire pour la taille maxi: comme ça, pas besoin d l'écrire à deux places différentes, surtout que tu avais mis 500000 dans le formulaire et 100000 dans le traitement, ce qui devait probablement bloquer.

Enfin, j'ai ajouté un test sur le chargement du fichier dans son répertoire : au moins si le chargement se fait ou ne se fait pas, il y aura un retour visuel direct.

Reviens avec le résultat de l'essai.

Posté : 11 juin 2005, 22:25
par boby79
est-ce que le dossier de destination à les droits en écriture ?
oui, merci quand meme :wink:

Posté : 11 juin 2005, 22:27
par boby79
Merci beaucoup cyrano voici le résultat pas encore satisfaisant mais deja mieux : http://www.avds79.com/form.htm

Posté : 11 juin 2005, 22:29
par boby79
a oui, j'oubliais :
Warning: move_uploaded_file(/photos/_Angel.gif): failed to open stream: No such file or directory in /home/clients/www/avds79.com/www/upload.php on line 29

Warning: move_uploaded_file(): Unable to move '/home/clients/interne/apache/upload/phpw4OWKU' to '/photos/_Angel.gif' in /home/clients/www/avds79.com/www/upload.php on line 29

Une erreur s'est produite : Le fichier n'a pas été correctement chargé.

Posté : 11 juin 2005, 22:33
par smarties
Essaye de replace $dest_dossier = '/photos/';
par $dest_dossier = 'photos/'; ou par $dest_dossier = './photos/';

Posté : 11 juin 2005, 22:36
par boby79
Merci beaucoup smarties !!!

Et merci à tous de votre patience et de votre aide, vous êtes géniaux :roll:

a tres bientot j'espere !!! :!:

Posté : 11 juin 2005, 22:36
par Cyrano
[Résolu] :?:

Posté : 11 juin 2005, 22:37
par boby79
Ouais !!! Encore merci à tous :D

Posté : 12 juin 2005, 00:53
par boby79
Bon j'ai crier victoire trop vite :( Ca marche bien, le problème, c'est que dès que le fichier fait plus de 200Ko ça marche 1 fois sur 20 ... et puis le maximum que j'ai pu faire c'est 295 Ko ...

C'est un problème de l'hébergeur ? du php ?

si vous voulez voir le résultat :

http://www.avds79.com/photos.htm (en bas de la page)

et le php http://www.avds79.com/upload.php

Merci beaucoup pour ce que vous avez deja fait pour m'aider !!!

a bientot :wink:

Posté : 12 juin 2005, 09:39
par smarties
Pour info, quand tu fais /repertoire/ le / au début va à la racine du disque et y cherche répertoire, c'est pour cela que ca ne marchait pas.