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

Eléphant du PHP | 343 Messages

18 juil. 2011, 12:20

Hop là me revoilà avec un script php qui marche (apparemment):
<form enctype="multipart/form-data" action="fileupload.php" method="post">
    Transfère le fichier <input type="file" name="monfichier" />
    <input type="submit"/>
</form>
<?php
if(isset($_FILES['monfichier']) and $_FILES['monfichier']['error'] == 0)
{
    $nomOrigine = $_FILES['monfichier']['name'];
    $elementsChemin = pathinfo($nomOrigine);
    $extensionFichier = $elementsChemin['extension'];
}
$extensionsAutorisees = array("flac", "txt","mp3", "mp4", "avi", "png", "jpg", "jpeg") ;
if(isset($extensionFichier))
{
    if(!(in_array($extensionFichier, $extensionsAutorisees)))
    {
        echo "<br/>Le fichier n'a pas l'extension attendue";
    }
    else
    {   
        $repertoireDestination = "FileUpload/";
        rename($_FILES['monfichier']['tmp_name'],$_FILES['monfichier']['name']);
        move_uploaded_file($_FILES['monfichier']['name'],$repertoireDestination);
        echo "<br/>".$_FILES['monfichier']['name'];
    }
}
?>
J'ai pu uploadé un .avi de 175mo et un .mp4 de 60mo.
Toutefois firefox a planté pas mal de fois, que ce soit en upload réussi ou non. J'aimerais savoir si ça vient du code.

Mes param:
post_max_size = 200M
upload_max_filesize = 200M
memory_limit = 1280M (là je me demande si c'est réaliste sur 1 mutu)
max_execution_time = 600 (pareil)
max_input_time = 600 (pareil)

J'aimerais bien un coup de main pour qu'on améliore un peu le script et qu'on trouve les bonnes valeurs pour le php.ini. Et qu'on voit pour les erreurs (du script et du navigateur qui plante).
Pour la progressbar, j'ai entendu dire qu'avec ajax, on pouvait récupérer la taille de la partie du fichier déjà uploadée. Avec cette valeur on pourrait faire 1 calcul pour savoir si ca fait 10% du fichier et à chaque 10% on affiche 1 image qui représentera 10% du fichier, 20, 30 etc...
Qu'en penses-tu? Est-ce possible?

Merci pour ton aide ;)
Développeur web

Eléphant du PHP | 343 Messages

21 juil. 2011, 14:20

Bon visiblement ça n'intéresse plus personne mais je recherche toujours un moyen pour la progressbar. Si quelqu'un a une astuce, je suis preneur.

merci ;)
Développeur web

Eléphant du PHP | 171 Messages

21 juil. 2011, 19:05

En fait, je t'ai proposé un applet Java parce que à réaliser par PHP, c'est mission impossible. Pourquoi ?
memory_limit = 1280M (là je me demande si c'est réaliste sur 1 mutu)
Là faut voir avec ton hébergeur, mais ça m'étonnerait fort !

Pour faire une progressbar en Ajax, il faudrait que ton upload se déroule aussi en Ajax. Parce que si tu ne le fais pas en Ajax, et bien la page va s’exécuter, mais tant qu'elle aura pas fini de d'exécuter le script(donc d'uploadé le fichier) ben t'auras rien à l'écran. En gros l'utilisateur ne sais pas ce qui se passe, et on sait tous ce que fait un utilisateur normal quand il ne voit/comprend pas ce qui se passe : il ferme son navigateur.
Et pour l'upload en Ajax, je crois que c'est vraiment du bidouillage à cause d'un point de vue sécurité, donc ça devient pas très pratique.

Ensuite, le truc en passant par les fonctions PHP pour réaliser ceci c'est que si ta 2 ou 3 personnes qui se mettent à upload un film en même temps, ta limite upload_max_filesize va très rapidement être atteinte, et l'upload sera un échec pour les 3.

Ça en fait déjà pas mal, et je pense que j'en ai oublié donc passé par un applet java (flash peut être ?) serait vraisemblablement la solution.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

21 juil. 2011, 19:54

Le développement coté php est finit et fonctionne bien. Si l'ajax ne permet pas de faire une progressbar comment faire alors?
Es-tu sur que la limite upload_max_filesize est pour tous les fichiers en même temps? Si oui, ça va poser probleme.

Les applets java, je n'y ai rien compris et le flash est trop lourd.

Merci pour ta réponse.
Développeur web

Eléphant du PHP | 171 Messages

22 juil. 2011, 03:58

Tiens voilà une applet super cool : http://sourceforge.net/projects/jupload/

Celle ci te permet pas de voir dans quel dossier va être upload le fichier, tu as une barre de progression..
Une petite démo ici : http://jupload.sourceforge.net/applet-b ... cture.html

Je te conseille vraiment de passer par une applet java, et je ne vois pas comment faire uniquement PHP. Trop de contraintes, ou qualité de l'upload instable. (tu l'as dit toi même : navigateur qui plante...)

L'applet en elle même utilise l'upload via PHP mais découpe le fichier, ce qui permet d'envoyer de gros fichiers.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

22 juil. 2011, 04:11

Ton applet m'a fait buggué mon firefox :lol:
Personnellement je ne trouve pas ça très pro de prendre quelque chose de déjà fait et sans pouvoir modifier le code source ni encore moins l'adapter à son site.

Sinon mes problèmes se sont arrangés et maintenant ça ne buggue plus. Je comprends bien que c'est peut-être plus pratique de prendre 1 applet mais ça ne me plait pas (sans compter le message de sécurité à peine arrivé sur le script et l'installation du java obligatoire). Connais-tu beaucoup de sites proposant 1 applet à la place d'un script avec 1 progressbar?
Je pense que rajouter une progressbar ne doit pas être si compliqué que ça, c'est juste que je ne maitrise pas le js.

Merci ;)
Développeur web

Eléphant du PHP | 171 Messages

22 juil. 2011, 04:41

Ah mais ton script coté PHP te permet maintenant d'uploadé des fichiers de 700 mo sans problème ?

Et donc actuellement, ça se passe comment ? Tant que le fichier n'est pas envoyé la page s’exécute ?
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

22 juil. 2011, 04:49

Non j'ai limité à 200mo, limite de mon post_max_size (enfin chez e-cliking).
Tant que l'upload n'est pas terminé, le script tourne et garde le input du form avec le chemin où est le fichier.

Si tu connais 1 hébergeur avec plus de 200mo, n'hésites pas à me le dire. Pour l'instant, mon soucis est surtout pour la progressbar indiquant que l'upload se déroule bien. Sinon la seule solution que j'aurais est de mettre 1 anim "bidon".
Développeur web

Eléphant du PHP | 171 Messages

22 juil. 2011, 05:13

Ok on peut faire ça avec la technologie Ajax : PHP et Javascript.
On en parles ici :
http://www.xorax.info/blog/programmatio ... -file.html (La deuxième solution semble pas mal)

Il y a plusieurs tutoriels sur le net qui t'explique comment utiliser Ajax, même sans grande notion de javascript.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

22 juil. 2011, 12:27

Parles-tu de submit form with frame target?
A vrai dire, je me suis tapé un peu toute la doc fr/us sur l'upload (enfin la progressbar) en ajax mais franchement je n'ai rien trouvé. Je pense que même si j'étais tombé sur le bon code, il aurait fallu modifié au mieux 1 ligne et vu que j'y connais rien...
Développeur web

Eléphant du PHP | 343 Messages

23 juil. 2011, 21:37

Finalement l'APC n'est pas accepté.
Une solution?

merci ;)
Développeur web

Eléphant du PHP | 171 Messages

30 juil. 2011, 23:15

J'ai vu que tu as marqué ton sujet résolu, finalement tu as opté pour quel solution ? Pour ceux qui chercheront plus tard ça sera cool si ils peuvent savoir ce que tu as fait finalement ;)
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 343 Messages

30 juil. 2011, 23:18

Upload php et je suis passé par un loader en .gif abandonnant l'idée du pourcentage (impossible à faire sans APC ou java etc...).
Au clic sur submit, un loader s'affiche pendant la durée de l'upload et à la fin, le loader disparait. Je verrais si je le mets vert avec écrit upload 100% (à voir).

Voilà ;)
Développeur web