8797 sujets

Développement web côté serveur, CMS

Salut à tous. je suis en train de faire un formulaire d'upload d'images qui fonctionne relativement bien.

Mais parfois j'obtient une erreur pendant l'upload. Parfois au bout de 10 fichier, parfois au bout de 40...

J'ai déjà fait passer 30 fichiers pour un total de 6mo mais parfois ca bug...

Je colle mon code


set_time_limit(0);
ini_set("memory_limit", "134217728");

for($i=1;$i<=count($_FILES)-1;$i++){
		$conn_id = ftp_connect($ftp_server);
		$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

if(ftp_fput($conn_id,$nouvelle_image,$fp,FTP_BINARY)){
$resize_image = imagecreatetruecolor($width, $height);	//Donne les nouvelles tailles
			imagecopyresampled ($resize_image,$imgsrc,0,0,0,0,$width,$height,$largeur,$hauteur); //Resize
			imagejpeg($resize_image, "miniature".$i.".jpg", 120); //Créer l'image 1
			$fp2 = fopen("miniature".$i.".jpg","r");
			if(ftp_fput($conn_id,$var.$nom_dossier."/miniature.jpg",$fp2,FTP_BINARY)){
				echo "mini<br />";
			}
			fclose($fp2);
			//unlink("miniature.jpg");
			echo "Chargement avec succès du fichier ".$file."\n";
		}
fclose($fp);
		ftp_close($conn_id);
	}


J'ai volontairement épuré le code à la copie ici (donc c'est normal si il manque des variables... le code était un peu long à copier et c'est jamais plaisant à lire).

En gros, je balance un nombre X de fichiers sur un ftp. L'un est simplement le fichier reçu par $_FILES et l'autre est une miniature de ce $_FILES que je créer puis upload via la même méthode

Ce que j'obtiens comme erreur est :

Warning: ftp_fput() [function.ftp-fput]: Opening data connection for miniature.jpg. in D:\wamp\www\XXX\page_XXX\upload_images.php on line 62

La ligne 62 correspond à :

if(ftp_fput($conn_id,$var.$nom_dossier."/miniature.jpg",$fp2,FTP_BINARY)){

C'est un peu brouillon comme explication alors hésitez pas à demander des précisions.

Merci d'avance.

Rude
Modifié par ffwrude (14 Jan 2008 - 11:44)
Administrateur
Bonjour,

n'y aurait-il pas de limite de temps ou de taille plus contraignante fixée par ton hébergeur (dans php.ini) ? Ca prend je crois le pas sur les limites fixées dans ton script.
Modifié par Felipe (14 Jan 2008 - 15:18)
Ah bon ? Je croyais que cela passait au dessus. Mais comme dit dans le message j'ai déjà upload 31fichiers pour un total de 6mo en une fois...

(en plus je suis mon propre hebergeur pour l'instant).

Rude
Administrateur
Si tu es ton propre hébergeur, tu as peut-être désactivé le safe_mode? Dans ce cas OK, mais chez un hébergeur c'est rarement le cas:

a écrit :
Notez que set_time_limit() n'a pas d'effet lorsque PHP fonctionne en mode safe mode. Il n'y a pas d'autre solution que de changer de mode, ou de modifier la durée maximale d'exécution dans le php.ini.


Pour memory_limit, tu sembles avoir raison: http://fr.php.net/manual/fr/ini.core.php#ini.memory-limit

Reste que changer la valeur définie dans php.ini permettrait d'éliminer facilement une 1ère source d'erreur Smiley cligne (edit: et aussi httpd.conf pour Apache ou .htaccess ?)
Modifié par Felipe (14 Jan 2008 - 18:11)
J'ai modifié comme tu m'as dit (le safe mode était OUT). et de toute façon j'apprend que nous hébergeront ce truc chez nous .... donc les hébergeurs j'ai le droit de m'en tamponner ... (en tout cas pour ce truc).

Mais ... rien y fait. Il "plante" toujours aléatoirement. Un peu comme si il y'avait une coupure, ou un échange qui se faisait mal...

Je pense que c'est juste un truc comme ca. Mais comme ca pourrait aussi venir du code ... je suis un peu dans le flou

Rude
J'ai fait pas mal d'essais d'upload (perl, php et même fileReference de flash), et j'en ai conclus qu'il n'y a pas de solution fiable avec le protocole http, pour les gros transfert, plus de 10M, il faut passer au ftp.

C'est le protocole utilisé par yousendit par exemple.

Par contre comme je n'ai pas encore eu l'occasion de travailler sur ce genre de formulaire (j'en suis resté au http images par images) je ne serais pas te dire la marche à suivre

Une chose est sur il vaut mieux partir sur perl que sur php
Modifié par matmat (14 Jan 2008 - 21:18)
et sur ton serveur tu as des valeurs suffisantes
a post_max_size et upload_max_filesize dans le php.ini ou .htaccess?

sinon je me demandais si cette option là pouvait jouer memory_limit. remarque je dis pas que c'est ça...mais je lis qu'elle limite la memoire vive que peux prendre un script .php...

faut peut-être faire des essais sur divers variables puisque vous avez la main sur le serveur.

mais je reste d'accord avec matmat en upload en php j'ai parfois eu des echec sans trop comprendre pourquoi. alors sur des gros envois c'est plutot moyen
Si jamais tu as des doutes sur le differences entre les upload http et ftp, essaye ce script perl : PSupload, c'est pas trop dur a configurer et ça marche plutôt trés bien.

Le probléme c'est que c'est difficile de l'adapter a une application existante, mais si c'est juste pour monter des fichiers dans un dossier c'est trés bien, par contre si tu dois mettre a jour une base de donnée en même temps, il faut connaitre perl.

EDIT : pardon je suis completement a coté de la plaque moi, ça m'aprendrat a lire le code trop vite, en fait tu utilise déja ftp mais en php, donc je dit n'importe quoi. aprés entre le perl et le php pour l'upload, je serais pas dire.

Par contre je ne sais pas si cela peut t'aider mais tu n'as pas besoin d'utiliser ftp_fput une deuxiéme fois quand tu redimensionnes l'image.
Modifié par matmat (15 Jan 2008 - 04:14)
Merci à vous pour vos réponses. Par contre je ne comprend pas en quoi je n'ai pas besoin d'utiliser un deuxieme ftp_fput() puisque j'envoi un deuxième fichier.

Peut tu expliquer un peu ce que tu veux dire par la ?

Je pense que je vais finalement m'orienter vers un script local ... car comme vous me dites que vous avez eu aussi des problèmes "aléatoires" quand aux erreurs d'uploads de fichiers ...

De plus pour moi pearl c'est une marque d'instruments de musique.... (En gros je ne connais absolument rien en perl... je sais même pas faire un echo dans ce langage).

Rude
Modifié par ffwrude (15 Jan 2008 - 10:42)
Le fonctions imagecreatetruecolor creer une autre image sur le serveur, donc pourquoi vouloir la recharger par ftp?

Pour perl, je ne connais pas bien non plus, mais le peu que j'en sais c'est vraiment bien surtout pour ce genre d'opérations. Sur les test que j'ai fait 100M passe sans probléme sur un hebergement mutualisé. Et surtout ce que j'aime bien c'est que à part coupure du serveur ça marche a tout les coups. J'ai charger plus de 100 images sans aucune erreur avec PERL, ce qui n'est pas le cas de php qui retourne réguliérement des erreurs pour les uploads.

Si tu connais php avec un peu d'effort tu peux rapidement comprendre la syntaxe a rajouter par exemple un ajout a la base de donné depuis un script d'upload existant et t'en sortir comme ça.
Salut Rude,

Si cela t'interresse j'ai fait un fichier d'upload utilisable avec php a partir d'une source de PerlServices.

Tu peux le trouver ici : http://www.smart-com.com.mx/perl_upload.txt

Pour l'installer il faut configurer les lignes suivantes :

my $web_site="http://www.domain.com";
my $files_folder="files/";


attention la variables $myfolder doit correspondre à un fichier depuis la racine du site

my $database="dbe_name";
my $hostname="localhost";
my $login = "db_login";
my $mdp = "db_pass";

my $mysql_table_doc = "documents";
my $mysql_field_url = "url";


Cette partie te permet d'actualiser ta base de donnée en même temps, $mysql_table_doc c'est le nom de ta table document et $mysql_field_url le nom de ton champs qui contiendra l'url de l'image ou du document. Si tu met rien dans $database, il n'actualisera aucune base de données mais il réalisera tout de même l'upload.

ensuite my @types te permet de définir les type de fichiers possibles.

Enfin le formulaire se presente comme ça :

<form action="/cgi-bin/upload.cgi/edit_doc.php?id_page=2" method="POST" ENCTYPE="multipart/form-data">
<font face="verdana" size=2><b>File Attachment
<div><input type="FILE" name="FILE1"></div>
<div><input type="FILE" name="FILE2"></div>
<div><input type="FILE" name="FILE3"></div>
<input type="hidden" name="FIELD_id_page" value="2">
<input type="hidden" name="FIELD_config" value="logo">
<input type="SUBMIT" value="Submit Form" style="cursor:hand;"></td>
</form>


Dans ton url tout ce qui est aprés le nom du script correspond a l'url de retour, par exemple ici ce serat : edit_doc.php?id_page=2.
Attention il y encore une limitation ici, il doit y avoir au moins un paramétre et il ne peut pas en avoir deux, je vais améliorer ça...

Tout les champs FILE1, FILE2 etc permettent d'insérer des fichiers, il "uploadera" un aprés l'autre

Tout les champs FIELD_name_field sont optionel et permettent d'ajouter des informations dans ta base, par exemple ici j'ajoute 2 au champ id_page et logo au champ config. Il y a aussi une limitation ici, ce serat les mêmes infos pour tout les documents du même formulaire, si tu veux mettre par exemple un champ text_alt, il faut uploader un par un.

Quand tu inseres ton cgi, il ne faut pas oublier de :
- renomer le fichier .txt en point .cgi
- mettre des droit 755 sur celui ci
- mettre des droits 777 sur les dossiers images
- verfier la premiere ligne du script #!/usr/bin/perl -- cela peut changer selon les hebergeurs, ou en local, par exemple pour moi en local c'est #!c:/Perl/bin/perl (avec windows)

EDIT : voilà j'ai fait la mise a jour, maintenant il est possible de faire :
- <form action="/cgi-bin/upload.cgi/edit_doc.php?id_page=2"
- <form action="/cgi-bin/upload.cgi/action.php?action=edit-doc&id_page=2"
- <form action="/cgi-bin/upload.cgi/ftp_upload.php"

Autre petite précision, si le fichier n'est pas correct il renverra message=bad_file dans l'url si il n'a pas reussi a uploader il renverra message=failed , j'ai fait ça pour pouvoir avertir l'utilisateur en retour.
Modifié par matmat (16 Jan 2008 - 18:53)