IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] Upload Incohérence !


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut [AJAX] Upload Incohérence !
    Bonjour à tous !
    Je me trouve devant un problème de taille développant une API en ajax pour l'upload de gros fichiers.
    Mon script fonctionne de la manière suivante :
    Le html affiche plusieurs form contenant un input file et le forme est dirigé vers un script serveur pour la récupération des fichiers en target vers une iframe différente pour chaque form.

    Lorsque l'utilisateur valide l'envoi, une requete ajax est envoyé pour lister le contenu du dossier temporarire histoire de récupérer la taille déjà transférée en temps réel. Cette requete se rappelle indéfiniment jusqu'à ce que le fichier soit arrivé.

    Mon problème est le suivant, lorsque je n'envoie qu'un seul fichier, pas de prob, tout marche comme prévu mais lorsque j'ai plusieurs form, donc plusieurs input file et plusieurs iframe et que je valide, tous les form se valide et les fichiers s'envoient (je le vois sur le server) mais ma requete Ajax sensée listé le contenu du dossier temporaire bloque juqu'à ce qu'il ne reste plus qu'un fichier en cours d'envoi. A ce moment là, le serveur répond à cette requete et mon script fonctionne... Donc imaginons que je veuille transférer 5 fichiers d'un coup, je ne connais pas l'avancement du téléchargement jusqu'a ce que 4 premiers fichiers soient arrivés sur le serveur, ensuite, il m'affiche l'avancement du dernier fichier en cours ...

    Est ce que quelqu'un a déjà été confronté à ce genre de prob ? On dirait que le serveur bloque toute réponse du meme client ... Car lorsque cette requete ajax bloque, en ouvrant un autre navigateur et en appellant direct le script php, il me répond bien ...

    Merci d'avance à tout ceux qui pourront m'apporter leur aide !

  2. #2
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Fais voir ton code à tout hasard

  3. #3
    Membre averti

    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    function submitUploadForm() {
    	var errorOnSubmit = false;
    	for (i=1;i<=numberInputs;i++) {
    		filesToUpload[i] = new Array();
    		var inputTMPCheck = "uploadFile-"+i;
    		//alert(inputTMPCheck);
    		filesToUpload[i]['value'] = document.getElementById(inputTMPCheck).value;
    		filesToUpload[i]['name'] = document.getElementById(inputTMPCheck).name;
    		filesToUpload[i]['filename'] = filesToUpload[i]['value'].substr(filesToUpload[i]['value'].lastIndexOf('\\')+1);
    		filesToUpload[i]['idInput'] = inputTMPCheck;
    		filesToUpload[i]['transfered'] = false;
    		var extensionTMP = filesToUpload[i]['filename'].substr(filesToUpload[i]['filename'].lastIndexOf(".")+1);
    		if (filesToUpload[i]['value'] != "") {
    			if (extensionTMP != "zip" && extensionTMP != "ZIP" && extensionTMP != "jpg" && extensionTMP != "gif" && extensionTMP != "png" && extensionTMP != "JPG" && extensionTMP != "GIF" && extensionTMP != "PNG" && extensionTMP != "JPEG" && extensionTMP != "jpeg") {
    				errorOnSubmit = true;
    				var idSpanError = "responseUploadFile-"+i;
    				document.getElementById(idSpanError).innerHTML = "<img src=\"/Style/img/Icons/inValid.jpg\" alt=\"Mauvaise Extension, Fichiers Zip ou Images Autorisés\" title=\"Mauvaise Extension, Fichiers Zip ou Images Autorisés\" />" ;
    				}
    			else {
    				var idSpanError = "responseUploadFile-"+i;
    				document.getElementById(idSpanError).innerHTML = "" ;
    				}
    			filesToUpload[i]['idSpan'] = idSpanError;
    			}
    		}
     
    	if (errorOnSubmit == false) {
    		idMember = encodeURI(transformAmp(document.getElementById('GlobalUploadForm').idMember_post.value));
    		objRequete = creeXMLHttpRequestObject();
    		objRequete.open('get', 'Ajax/PHP/Galleries/gallery.initCreate.php?idMember='+idMember+'&name=' + encodeURI(transformAmp(document.getElementById('GlobalUploadForm').name_post.value)), true);
    		objRequete.send(null);
    		objRequete.onreadystatechange = traiteReponseToSubmit;
    		}
     
    	} 
    function traiteReponseToSubmit(){
    	if (objRequete.readyState == 4) {
    		var retour = objRequete.responseText;
     
    		if (retour == "error") {
    			alert("Errors In form");
    		}
    		else {
    			var retourArrayTmp = retour.split('-');
    			idGallery = retourArrayTmp[0];
    			timeStamp = retourArrayTmp[1];
    			destructCode = retourArrayTmp[2];
    			document.getElementById('DynGalleryId').value = idGallery;
     
    			//alert(numberInputs);
    			for (var i = 1; i <= numberInputs; i++) {
    				var inputTMPCheck = "uploadFile-" + i;
    				if (document.getElementById(inputTMPCheck).value == "") {
    					document.getElementById(inputTMPCheck).style.display = "none";
    					filesToUpload[i]['transfered'] = false;
    				}
    				else {
    					var formIdTMP = "formFile-" + i;
    					var spanResponseIdTMP = "responseUploadFile-" + i;
    					var inputFileTMP = "uploadFile-" + i;
    					var inputButtonTMP = "button-file-";
    					var nbButtonsToHide = nbRows;
    					var inputHiddenIdGallery = "file-" + i + "-idGallery";
    					var inputHiddenStamp = "file-" + i + "-stamp";
     
    					document.getElementById(spanResponseIdTMP).innerHTML = "<img src=\"/Style/img/AjaxLoad/loading2.gif\" alt=\"Upload in Progress\" title=\"Upload in Progress\" />";
    					document.getElementById(inputHiddenIdGallery).value = idGallery;
    					document.getElementById(inputHiddenStamp).value = timeStamp;
    					for (q = 1; q <= nbButtonsToHide; q++) {
    						var inputButtonTMP2 = inputButtonTMP + q;
    						document.getElementById(inputButtonTMP2).style.display = "none";
    					}
     
    					document.getElementById(formIdTMP).submit();
    					document.getElementById(inputFileTMP).disabled = true;
     
    				}
     
    			}
     
    			document.getElementById("ComeBack").style.display = "none";
    			document.getElementById("buttonValidGlobalForm").disabled = true;
    			document.getElementById("ResponseGlobalAjax").innerHTML = "Initialisation du Téléchargement...";
    			document.getElementById("blockInteractAjax").style.display = "block";
    			objRequete = null;
    			traceTmp();
     
     
    		}
    	}
    	else {
    		//alert('Error ReadyState');
    	}
    }
    function traceTmp() {
    	objRequete = creeXMLHttpRequestObject();
    	objRequete.open('get', 'Ajax/PHP/Galleries/gallery.checkTemporaryFolder.php', true);
    	objRequete.send(null);
    	objRequete.onreadystatechange = getTmpFilesSize;
    }
    function getTmpFilesSize (){
    	//alert(objRequete.readyState);
    	if (objRequete.readyState == 4) {
    		var xml = objRequete.responseXML;
     
    		if (xml.getElementsByTagName('result')[0].getAttribute('state') == 1) {
    			if (xml.getElementsByTagName('file').length != 0) {
     
    				var totalSizeTransfered = "";
    				// Ne s'execute qu'à la première réponse après le Submit pour récupérer toutes les infos des fichiers du user
    				if (firstTimeTemporaryResponse){
    					for(i=0;i<xml.getElementsByTagName('file').length;i++){
    						var isOwnerFiles = true;
    						for (o=0;o<tmpFilesIgnore.length;o++) {
    							if (tmpFilesIgnore[o] == xml.getElementsByTagName('file')[i].childNodes[0].data){
    								isOwnerFiles = false;
    							}
    						}
    						if (isOwnerFiles == true) {
    							var arrayTmpFile = new Array();
    							arrayTmpFile['name'] = xml.getElementsByTagName('file')[i].childNodes[0].data;
    							arrayTmpFile['size'] = xml.getElementsByTagName('file')[i].getAttribute("size");
    							tmpFilesUpload.push(arrayTmpFile);
    						}
     
    					}	
    					firstTimeTemporaryResponse = false;
    				}
    				// S'éxécute à chaque fois
    				if (tmpFilesUpload.length == 0) {
    					objRequete = null;
    					traceUpload();
    				}
    				else {
    					for (i = 0; i < tmpFilesUpload.length; i++) {
    						var userFilePresent = false;
    						for (o = 0; o < xml.getElementsByTagName('file').length; o++) {
    							if (xml.getElementsByTagName('file')[o].childNodes[0].data == tmpFilesUpload[i]['name']) {
    								userFilePresent = true;
    								tmpFilesUpload[i]['size'] = xml.getElementsByTagName('file')[o].getAttribute('size');
    							}
    						}
    						totalSizeTransfered += parseInt(tmpFilesUpload[i]['size']);
    						if (!userFilePresent) {
    							var arrayTmpFilesUpload = new Array();
    							for (l = 0; l < tmpFilesUpload.length; l++) {
    								if (l != i) {
    									arrayTmpFilesUpload.push(tmpFilesUpload[l]);
    								}
    							}
    							tmpFilesUpload = arrayTmpFilesUpload;
    						}
    					}
    					var displaySize = null;
    					var sizeValue = parseInt(totalSizeTransfered);
    					displaySize = fSize(totalSizeTransfered, 2) + " Transférés ... ";
    					document.getElementById("ResponseGlobalAjax").innerHTML = displaySize;
    					traceTmp();
    				}
    			}
    			else {
    				objRequete = null;
    				traceUpload();
    			}
    		}
     
    	}
    }
    Si ca peut aider

Discussions similaires

  1. [AJAX] upload d'images php/ajax
    Par zehni dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/08/2007, 14h13
  2. [AJAX] upload image + recup variable
    Par minimoof dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 31/05/2007, 21h57
  3. [AJAX] upload photo ajax
    Par kimcharlene dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/03/2007, 17h55
  4. [AJAX] Upload de fichier
    Par hedgehog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/10/2006, 07h57
  5. [AJAX] upload fichiers avec AJAX
    Par jibouze dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 08/12/2005, 21h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo