Problème avec un script d'upload de fichiers => progressbar

Eléphant du PHP | 343 Messages

17 juil. 2011, 03:39

Bonjour,

J'ai un probleme avec mes scripts d'upload de fichiers. L'upload fonctionne pour de petits fichiers (png, jpg etc...) mais dès que le fichier dépasse x Mo, impossible de procéder à l'upload avec succès.
Le but de ce script est d'uploader des .mp4 ou des .avi de plusieurs centaine de Mo (le .png a été rajouté pour faire des tests).

Mon formulaire:
<html>
  <body>
    <form enctype="multipart/form-data" action="fileupload.php" method="post">
      <input type="hidden" name="MAX_FILE_SIZE" value="100000M" />
      Transfère le fichier <input type="file" name="monfichier" />
      <input type="submit" />
    </form>
  </body>
</html>
Mon fileupload.php:
<html>
<body>
<?php
    ini_set("post_max_size", "100000M");
    ini_set("upload_max_filesize", "100000M");
    ini_set("memory_limit", -1 );

    $nomOrigine = $_FILES['monfichier']['name'];
    $elementsChemin = pathinfo($nomOrigine);
    $extensionFichier = $elementsChemin['extension'];
    $extensionsAutorisees = array("mp4", "avi", "png") ;
    if (!(in_array($extensionFichier, $extensionsAutorisees))) {
        echo "Le fichier n'a pas l'extension attendue";
    } else {   
        // Copie dans le repertoire du script avec un nom
        $repertoireDestination = dirname(__FILE__)."/fichiers";
        $nomDestination = "$nomOrigine";

        if (move_uploaded_file($_FILES["monfichier"]["tmp_name"],
                                         $repertoireDestination.$nomDestination)) {
            echo "Le fichier temporaire ".$_FILES["monfichier"]["tmp_name"].
                    " a été déplacé vers ".$repertoireDestination.$nomDestination;
        } else {
            echo "Le fichier n'a pas été uploadé (trop gros ?) ou ".
                    "Le déplacement du fichier temporaire a échoué".
                    " vérifiez l'existence du répertoire ".$repertoireDestination;
        }
    }
    ?>
</body>
</html>
J'obtiens des erreurs comme:
Notice: Undefined index: monfichier on line 8

Notice: Undefined index: extension on line 10
Le fichier n'a pas l'extension attendue

alors que je suis en mp4 et que l'upload de petits .png fonctionne.

Dans un deuxième temps j'aimerais mettre en place une progressbar en js.
Comment pourrais-je faire? J'ai fait pas mal de recherches mais j'ai rien trouvé de concluant.
Me conseillez-vous de prendre 1 script déjà fait et si oui lequel?

Merci pour votre aide, je commence à désespérer.
Modifié en dernier par sam12 le 23 juil. 2011, 04:56, modifié 1 fois.
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 03:55

Salut,

L'envoi de gros fichiers en PHP via la méthode HTTP est déconseillé pour une question de performances et de sécurité.
Les serveurs mutualisés restreignent donc via le php.ini la quantité de données transmissible pour un upload via la méthode HTTP.
C'est donc pour ça que l'envoi de tes petits fichiers fonctionnaient correctement mais pas pour les gros fichiers.

Je te propose de te tourner vers les fonctions FTP de PHP : http://php.net/manual/fr/book.ftp.php

Pour ce qui est de l'envoi via FTP après un petit coup d'oeil, je vois que tu as un exemple très bien détaillés ici : http://www.php.net/manual/fr/ftp.examples-basic.php,
et je pense que tu devrais arriver à t'en sortir avec normalement. :wink:
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 04:03

Oui je sais que l'upload via le navigateur n'est pas top mais je crois que si je fournis un accès ftp à mes membres, "ca craint" niveau sécurité n'est-ce pas? Sinon pourrais-tu être plus précis pour le ftp?
Le ftp ne permet pas l'envoi du disque de mes membres à mon hébergeur, d'après ce que j'ai cru avoir compris?
Mon hébergeur limite à 200mo ce qui est déjà pas mal d'après mes recherches.

Merci pour ta réponse ;)

PS: le script ne marche pas non plus sous easyphp malgré mes changements du php.ini.
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 04:26

En fait, j'ai d'une part mal compris ton problème et d'autre part découvert un autre truc aussi. Je n'ai jamais utilisé les fonctions FTP de PHP et je me suis donc mal renseigné quand à leur fonctionnement. Donc oublie ce que je t'ai dit plus haut.

Donc pour ton problème essaye de voir par ici à la fin du tutoriel tu as des instructions pour les fichiers volumineux :
http://www.phpfrance.com/tutoriaux/inde ... e-fichiers

Ça répond même à ta deuxième question pour la barre de chargement.

Après je pense que ça va vraiment dépendre des restrictions de ton serveur.

Pour ce qui est de ton script, il est tard et j'ai vraiment pas la motivation de regarder désolé ^^

Bonne nuit !
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 04:42

Mon projet consiste à permettre à mes membres d'uploader des fichiers de leurs dd vers mon hébergeur pour permettre aux autres membres de pouvoir les regarder.
Pour cela j'avais pensé à faire une sorte de "megaupload" version mega simplifiée.

Pour l'article, je l'avais déjà lu il me semble. Il parle aussi (encore) de photos et pour les gros fichiers, j'ai déjà modifié ces paramètres dans le php.ini de easyphp.

Pour la progressbar, il s'agit de APC, je crois. J'ai lu pas mal de fois que ce n'est pas encore au point (ça plante assez pour rien et aucun moyen d'anticiper l'erreur) et que peu d'hébergeurs l'avait mis en place.

Pour l'instant, je n'ai pas trop de restrictions, je teste sous easyphp donc en local, je peux mettre un peu ce que je veux en paramètres.

Pas de soucis, bonne nuit à toi aussi ;)
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 13:19

Salut,

Il faut que post_max_size possède une valeur plus grande que upload_max_filesize. http://www.php.net/manual/fr/ini.core.p ... t-max-size
Ensuite, faudrait régler le temps maximum d'éxecution http://www.php.net/manual/fr/info.confi ... ution-time mais c'est assez bridée, surtout si tu es en mutualisée, et même sur un dédié tu risques de saturé ton serveur assez rapidement si plusieurs personnes uploads. De plus si tu es en mutualisée, comme c'est noté, si safe_mode activé, tu peux pas changer la directive à la volée avec ini_set.

Donc après avoir lu quelques articles et posts de forum, apparemment, j'ai bien l'impression que ça n'a pas l'air possible de cette manière. Il faudrait vraiment que tu fasses un upload par FTP finalement.
J'ai récupéré un lien en passant : http://matt.phptest.free.fr/php_upload_to_my_ftp/ . J'ai pas regardé donc je ne sais pas du tout ce que ça vaut.
Pour ce qui est de la question de la sécurité, si tu procède à un upload par FTP, pense à sécuriser ton répertoire ou seront uploadé les fichiers, si ceux ci sont accessibles de l'extérieur.
Il ne te sera pas difficile après de lister ces fichiers, etc...

Petite remarque (importante) :
Pour le nom du fichier, il serait préférable d'effectuer un traitement de remplacement de caractères non désirée, car ça pourrait poser des problèmes par la suite.

Petite remarque (sans importance) :
Dans ton script tu fais :
    $elementsChemin = pathinfo($nomOrigine);
    $extensionFichier = $elementsChemin['extension'];
Tu peux faire directement :
$extensionFichier = pathinfo($nomOrigine,PATHINFO_EXTENSION);
En espérant que je raconte pas trop de bêtises, et que si il y a des personnes mieux renseigner la place est à vous :)
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 16:06

Donc il vaut mieux laisser de coté l'upload par http?

Je viens d'essayer le script mais je n'arrive pas à le faire fonctionner, je ne sais pas si c'est parce-qu'il date de 2002 mais impossible.
Par contre je ne comprends pas comment fonctionne ce script. On fait "parcourir" comme sur un script d'upload normal mais ça envoie au ftp? Je ne vois pas comment c'est possible.
A moins qu'il fasse donner un login ftp à mes membres mais je ne pense pas que ce soit ca.

Lorsque l'upload réussit, il faut que je le copie dans un répertoire protégé par 1 htaccess pour éviter que tout le monde y est accès. Est-ce possible avec ce script?
Après pour la partie download, ça sera tout un cirque avec des liens symboliques etc...

Pour le nom du fichier, je pense que je la renommerais, video001 et à chaque vidéo, je rajouterais 1.

Merci ;)

Edit: Je viens de lire ça: http://www.hosting.com/support/upload/browser-ftp mais quand je tape ftp://[email protected] avec mes logins ftp + mon ndd, ça ne marche pas.
Ça vient de l'hébergeur ou la syntaxe ne va pas?
Mais là il faudra le pass et niveau sécu, c'est pas top ;)
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 17:06

Finalement l'upload par HTTP à l'air possible grâce à un applet Java ! ça en parle ici : php-debutant/upload-http-upload-ftp-php-t252402.html
Voici un applet gratuit : http://sourceforge.net/projects/zupload/

Je pense que la solution est pas loin.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 17:12

J'ai compris l'inverse:
A noter que l'upload d'un fichier par FTP depuis un utilisateur vers un serveur est possible, non pas en PHP mais avec une applet Java.
http://www.google.com/search?q=applet+upload+ftp
J'en comprends que l'upload est possible par ftp et non par http (avec l'applet) non?
Par contre je ne connais pas du tout les applets
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 17:18

Euh ouais, en fait on envoi bien le fichier par FTP mais on fait comme si il s'agissait d'un envoi HTTP. Je regarde l'applet et je te dis, jamais utilisé non plus je découvre avec toi.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 17:20

Ok merci.
Parce-que là on se trouve avec 1 .jar et un .htm. Je ne vois pas trop comment modifier les options d'upload (login ftp, extensions autorisées etc...) ni le design.
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 18:18

Re,

Alors l'applet que je t'avais link est en fait pas top car on peut récupérer les ID's directement dans le code source de la page.

J'en ai trouvé un autre : http://www.jscape.com/products/file-tra ... tp-applet/
où tu te sert du fichier params.txt pour mettre tes identifiants. Avec un .htaccess tu peux bloquer l'accès au fichier.

Et après pour ce qui est du compte FTP, si tu crée un compte FTP spécifique à cet tâche(upload de fichier) avec un certains mot de passe, et tu défini à chaque fois sur tes fichiers les droits de lecture, écriture ou exécution. Dans ton cas, je crois que ton client n'a le droit qu'a l'écriture.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 18:28

Euh, je rêve où le prix est de $499.00 :shock:

Si je donne un même log ftp pour tous mes membres, ils ne risquent pas de supprimer les fichiers des autres? Puis-je creer un compte FTP pour chacun de mes membres plutôt?
Comment récupérais-je les fichiers par la suite?

merci ;)

Edit: J'ai installé le .exe, je ne vois pas trop quoi faire avec ce logiciel, peux-tu m'expliquer? merci ;)
Développeur web

Eléphant du PHP | 171 Messages

17 juil. 2011, 19:04

Le .exe ? Euh, c'est un dossier contenant des fichiers HTML et un ficher .jar.
Je te refile le lien : http://www.jscape.com/downloads/secure-ftp-applet
Et c'est une version d’évaluation mais fonctionnel à 100%. Après en cherchant un peu je suis sur que tu peux trouver quelque chose libre et sécurisé.

Pour l'applet actuel :
Tu copies le répertoire dans le répertoire de ton site web et tu te rends à l'adresse de ce répertoire.
Mais au préalable pense à modifier le fichier params.txt et à remplacer par tes valeurs à toi :
# set FTP hostname
hostname = adresse du serveur ftp
# set FTP username
username = nom d'utilisateur
# set FTP password
password = mot de passe
Si je donne un même log ftp pour tous mes membres, ils ne risquent pas de supprimer les fichiers des autres? Puis-je creer un compte FTP pour chacun de mes membres plutôt?
Comment récupérais-je les fichiers par la suite?
Pour ce qui est utilisateurs, je trouve qu'il serait un peu inutile de créer plusieurs utilisateurs. Le passage par FTP te sert uniquement à uploadé des fichiers.
Une gestion de FTP ne se fait pas via des droits d'utilisateurs mais via des droits sur les fichiers. T
Par contre tu peux restreindre un utilisateur à un certains dossier : en serveur mutualisé c'est par ton cPanel que tu devras passé.

Pour gérer les droits des fichiers via PHP : http://php.net/manual/fr/function.chmod.php
Dans ton cas, un chmod sur le dossier où seront uploadés tes fichiers en écriture uniquement.

Tu peux, par exemple lancé cette commande dès qu'un fichier a été uploadé, à toi de jouer avec l'applet Java et PHP pour ça.
De la documentation sur les droits : http://www.siteduzero.com/tutoriel-3-96 ... #ss_part_2

Voilà, bonne chance ;)
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

17 juil. 2011, 19:51

J'étais parti sur la partie télécharger mais j'ai pris le .exe :roll: n'importe quoi

Je viens d'essayer le script, tout à l'air de bien marcher.
J'ai quelques doutes, lorsqu'on se connecte, le pass apparait avec des ****, n'y a t-il aucun risque qu'on puisse le déchiffrer?
Ce que j'ai peur en laissant uploader n'importe quoi à mes membres sur un même compte ftp, déjà il y a le danger qu'ils uploadent vraiment n'importe quoi mais aussi qu'ils récupèrent les vidéos des autres membres et/ou les supprimer tout aussi facilement.
Ils peuvent aussi se servir du serveur pour uploader n'importe quoi et partager le lien sans que je puisse contrôler avant.
Par le cpanel, pourrais-je bloquer la suppression et le download de fichiers des autres membres (si on garde l'hypothèse d'un compte ftp partagé entre tous)?
Pourrais-je bloquer les dossiers pouvant être lus/téléchargés par mes membres? Il est hors de question qu'ils puissent télécharger le script du site.

Une fois uploadés, les fichiers sont dans le dossier choisi par mes membres mais puis-je le protéger directement par un htaccess ou tout autre moyen.
A la base avec mon script, je voulais qu'ils puissent uploader leur fichier dans un dossier tenu secret (donc aucun moyen pour eux de savoir où était le fichier) et après validation, je copiais le fichier dans 1 autre dossier protégé par htaccess qui à la demande d'un membre, pouvait télécharger le fichier avec un lien symbolique. A condition qu'il puisse, avec des verifs php de rigueur.

Merci pour ton aide ;)

PS: J'ai un message signalant que le script n'est là que pour évaluation donc pourrais-je l'utiliser pour mon site?
Développeur web