Upload d'images.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Upload d'images.

par Invité » 04 mai 2006, 18:33

Bien non, ça fonctionne avec tous les types de fichiers, je viens d'essayer :

Il faut un répertoire upload au même endroit de que le script php.
<?php

if( isset($_POST['envoi']) )
{
    // Vérification de l'image
    if( isset($_FILES['pdf']) )
    {
        unset($message);
        $ext = array('pdf', 'PDF');
        $poids = 2000000;
        
        $temp = './upload/';
        
        if( !in_array(substr(strrchr($_FILES['pdf']['name'], '.'), 1), $ext) )
        {
            $message = 'Cette extension de fichiers n\'est pas autorisé.';
        }
        elseif( file_exists($_FILES['pdf']['tmp_name']) && filesize($_FILES['pdf']['tmp_name']) > $poids )
        {
            $message = 'Votre document dépasse la taille autorisée.';
        }
        if( !isset($message) )
        {
            $dest = basename($_FILES['pdf']['name']);
            $dest = strtr($dest,
            'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
            'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
            
            $dest = preg_replace('`([^.a-z0-9]+)`i', '_', $dest);
            // copie du fichier
            $envoi = move_uploaded_file($_FILES['pdf']['tmp_name'], $temp . $dest);
            if( $envoi === false )
            {            
                $reussite = 'Une erreur s\'est produite lors de l\'enregistrement de votre document, merci d\'en aviser l\'administrateur du site';
            }
            else
            {
                $reussite = 'Votre document a bien été enregistré, merci';
            }
        }
        else
        {
            echo $message;
        }
    }

}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-15" />
 </head>
<body>
<?php
if( isset($reussite) ) echo '<p>' . $reussite . '</p>';
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
  <p>
    <!-- <input type="hidden" name="MAX_FILE_SIZE" value="500000" /> -->
    <label for="pdf">Votre fichier <acronym title="Portable Document Format">PDF</acronym> : 
    </label><input type="file" name="pdf" id="pdf" />
  </p>  
  <p>
    <input type="submit" name="envoi" value="Envoyer" />
  </p> 
</form>  

</body>
</html>
Pour les gros fichiers, il faut modifier le php.ini comme expliqué dans le tutoriel, enfin si tu y a accès.

par béka » 04 mai 2006, 16:42

ca ne marche pas, tu es sur qu'il n'y a iren d'autre a changer que l'extension du fait que c'est un pdf ?

par Béka » 04 mai 2006, 16:08

j'ai juste a reprendre ton code et a rajouter pdf ?
c'est aussi simple?
bé merci alors

par Invité » 04 mai 2006, 16:07

Eh bien tu rajoutes pdf aux extensions autorisées et en ajoutant une condition, si c'est un *.pdf, on autorise un poids de tant de mégaoctets.

:P

upload pdf

par béka » 04 mai 2006, 16:01

Moi c'est pareil, en plus je suis novice, je voudrais permettre à des internautes d'uploader des fichiers au format pdf sur un serveur pour que ceux-ci soient consultables par la suite. Or je ne sais pas comment faire pour permettre l'upload. Quelqu'un peut-il m'aider.

Merci

par Invité » 02 mai 2006, 19:20

Oui, c'est sûr, après avoir renommé un services.bat en services.jpg, j'obtiens un "aperçu non disponible", mais en aucun le .bat que j'ai renommé ne s'exécute et ouvre le services.msc comme il le fait avec l'extension correcte.

Mais c'est certains qu'après avoir redonné l'extension correcte, il y a un risque.

De toute façon comme je suis du genre parano, je vais y mettre le maximum de vérification :D

Merci :wink:

par Erazer » 02 mai 2006, 18:49

je te dis ça par expérience :)

tu me dis que ça fonctionne pas sur ta machine, c'est sûr :)
quand tu remarques qu'un upload filtre sur l'extension.

tu renomes ton fichier.zip en fichier.jpg, tu l'envoies sur le serveur, tu distribues ton lien, la personne le reprend et renome enfin le fichier.jpg en fichier.zip.

cependant, tu en fais ce que tu veux, ce n'était qu'une remarque :)

par Invité » 02 mai 2006, 18:18

Oui, mais excuses moi de mon ignorance, mais si je transforme un *.exe ou encore un *.bat en jpg, gif ou encore png, sur ma machine, il ne s'exécute pas, normal puisqu'il est défini comme une image et non comme ce qu'il est censé être, et donc sa dangerosité est nulle, enfin à mon avis.

A moins qu'il ne change d'extension tout seul :o , mais alors là j'aurais pas tout suivi :P

par Erazer » 02 mai 2006, 14:26

renome un fichier.exe en fichier.jpg
et refait ton test

par Invité » 02 mai 2006, 13:15

Merci :D

> henrydomis, j'ai essayé en mettant un chmod à tous mes dossiers et fichiers de façon correcte, comme tu m'as précisé, mais ça n'a rien changé.

> Erazer, j'ai pas bien compris, si j'essaies d'envoyer un *.exe avec ce script, le fichier n'est pas uploadé, j'ai essayé avec *.jpg.exe, et c'est pareil, mais je vais faire comme tu as dis, plusieurs précautions valent mieux qu'une :P

> Ryle, tu as trouvés, j'avais mis le point sur linux, car j'en ai pris l'habitude, mais sur windows, cela ne m'a jamais posé problème de ne pas le mettre.

J'ai honte :oops: , toutes les images que j'ai uploadées sont dans le répertoire TEMP de windows (j'avais oublié qu'il ne respectait pas la casse).
De plus comme le répertoire de mon site est sur une autre partition, je n'ai pas pensé qu'il aurait pu uploader sur la partoche windows.

Merci beaucoup à tous, c'est résolu :wink:

par Ryle » 02 mai 2006, 10:27

Ah oui aussi, sur linux j'obtiens :

echo de $_FILES['img']['tmp_name'] => /tmp/phpRsMSXh
echo de $temp . $dest => ./temp/console.png

Donc a-priori, rien de différent...
Il y a une grosse différence pourtant, le point qui précède ton "/" initial indique que le chemin se fait par rapport au dossier en cours (./) . S'il n'y a pas de point au début (/) il se base sur la racine de ton disque ce qui n'a probablement rien à voir.
Je pense qu'il te faut donc t'assurer que le point est bien présent, ou bien tout simplement ne pas commencer le chemin par un / :)

par Erazer » 02 mai 2006, 09:35

si je puis me permettre :)

pour les images, c'est mieux de ne pas se baser que sur l'extension :)

si la personne change le nom (fichier.exe en fichier.jpg) elle poura l'envoyer sur ton serveur


quand tu envoies un fichier avec un formulaire, tu as la donnée suivante

$_FILE['fichier']['type'] qui correspond au type mime du fichier.

exemple:

image/jpg
image/gif
image/png
.
.
.


c'est un peu plus fiable que l'extension.

ensuite pour ce qui est du php tu as la fonction getimagesize()

qui te permet aussi de récupérer différente info afin de vérifier que ça soit vraiment une image.

par henrydomis » 02 mai 2006, 09:04

j'ai eu un probleme d'upload, et de droits plus spécifiquement, donc pour ceux qui auront aussi un problème:

j'ai trouvé sur php.net

chmod("source_du_fichier.extension", $droit);

avec
$droit = 0777; //tous les droits, tous les utilisateurs
$droit = 0666; //ecriture, lecture , tous les utilisateurs...
...
...
il faut juste ne pas oublier le 0 devant la serie de droit.
vous pouvez utiliser les xrw+ , et je vous envoie sur php.net , recherche chmod dans les fonctions et la doc sera affichee.

par Invité » 29 avr. 2006, 17:56

Bonjour,

J'ai essayé ce script sous linux, et en ayant mis le chmod à 777, cela fonctionne bien :P

Ah oui aussi, sur linux j'obtiens :

echo de $_FILES['img']['tmp_name'] => /tmp/phpRsMSXh
echo de $temp . $dest => ./temp/console.png

Donc a-priori, rien de différent...

Personne ne voit pourquoi sous windows, mes images ne s'enregistrent pas dans mon répertoire ?

par Invité » 27 avr. 2006, 15:38

Ah, oui, j'avais oublié de changer le nom de la variable, mais ça ne change rien, toujours pas d'enregistrement.

Un echo de $_FILES['img']['tmp_name'] me donne C:\WINDOWS\TEMP\php14.tmp

Et un echo de $temp . $dest me donne /temp/console.png

J'ai également un problème avec ce script, c'est que lorsqu'après un premier envoi, j'actualise ma page, mon navigateur plante, c'est bizarre :cry: