Bonjour à tous,
D'habitude Google est mon copain mais là il me répond "dém... toi"
Voici mon problème : en gros avez vous déjà utilisé ftp_put ou ftp_nb_put avec startpos > 0 ?.
Pour qui n'ont pas envie de lire tout mon blabla (et qui ont peut être déjà la solution ), voici mon code
Fonction d'envoi dans ma classe FTP :
Appel de cette fonction depuis un fichier "envoifichier.php" lui même appelé via AJAX :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public function Envoyer($Fichier, $FichierLocal = "", $Depart = 0) { if ($this->Connection === false) { return false; } if ($FichierLocal == "") { $FichierLocal = $Fichier; } $Ret = @ftp_put($this->Connection, $Fichier, $FichierLocal, FTP_BINARY, $Depart); return $Ret; }
Et cas où ça vous intéresse, mais je ne pense pas que ce soit là que vienne le problème, le code en javascript qui appelle le fichier ci dessus :
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 $TailleFichier = filesize($Dossier.$NomFichier); $Depart = isset($_GET["depart"]) ? $_GET["depart"] : 0; if ($Depart > 0 || $TailleFichier > TAILLEFICHIERMAX) { $NomFichierTemp = TEMP."/fichiertemp.tmp"; $FichierTemp = fopen($NomFichierTemp, "w"); $Fichier = fopen($Dossier.$NomFichier, "r"); fseek($Fichier, $Depart); $Temp = fread($Fichier, TAILLEFICHIERMAX); fwrite($FichierTemp, $Temp); fclose($Fichier); fclose($FichierTemp); $Retour = $Ftp->Envoyer($Dossier.$NomFichier, $NomFichierTemp, $Depart); if ($Retour == false) { $Retour = "Erreur"; } else { $Retour = ($Depart + TAILLEFICHIERMAX)."/".$TailleFichier; } } else { $Retour = $Ftp->Envoyer($Dossier.$NomFichier) == false ? "Erreur" : "Ok"; }
Explications : J'ai créé pour un client une application web qui fonctionne en local, avec un serveur apache, donc sans accès à internet. Puis le client m'a demandé de pouvoir mettre à jour cette application via le web. Les scripts tous faits étant éxistants (ou Google ne m'a pas guidé correctement et j'ai fini par laisser tomber la recherche), j'ai créé ma propre classe de gestion par FTP. Tout va bien chez moi (à force de recherches et d'arrachages de cheveux ), il est possible d'envoyer toute une arboresrence en envoyer fichier par fichier via une interface en AJAX. Le souci est que j'envoie des fichiers qui font plusieurs Mo (des musiques et des vidéos) et ça foire chez le client qui n'a pas un débit bien élevé : lorsqu'il envoie un gros fichier, celui ci ne dépasse jamais 1Mo, il y a certainement un temps dépassé lors de l'appel du fichier d'envoi depuis AJAX.
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 function EnvoiFichier() { $("#IndexFichierEnvoye").html("envoi " + Number(IndexFichier + 1) + " sur " + ListeDeFichiers.length); if (Depart == 0) { $("#InfoEnvoi").html($("#InfoEnvoi").html() + "Envoi de " + ListeDeFichiers[IndexFichier] + "...<label id=\"Avancement" + IndexFichier + "\"></label><br />"); } $.ajax({url : "envoifichier.php", type : "GET", data : {dossier : DossierCRC, nomfichier : ListeDeFichiers[IndexFichier], depart : Depart}, success : FinEnvoiFichier}); } function FinEnvoiFichier(Retour) { if (Retour != "Ok" && Retour != "Erreur") { Retour = Retour.split("/"); $("#Avancement" + IndexFichier).html(Math.round(Retour[0] * 100/Retour[1]) + "%"); Depart = Retour[0];alert(Retour); EnvoiFichier(); } else if (IndexFichier < ListeDeFichiers.length) { $("#Avancement" + IndexFichier++).html(Retour); Depart = 0;alert(Retour); EnvoiFichier(); } else { $("#InfoEnvoi").html("Terminé"); } }
Du coup, j'ai vu un paramètre intéressant dans la fonction ftp_put, il s'agit de startpos. J'ai donc coupé le fichier que je souhaite envoyer en petits morceaux, via une boucle parcourant le fichier à envoyer, créant un fichier temporaire de 100ko qui est envoyé à la suite du fichier déjà envoyé.
Le premier ftp_put fonctionne (j'affiche une boîte de dialogue à la fin de l'envoi et je regarde avec filezilla), il y a bien le fichier sur le serveur faisant 100ko. Au deuxième envoi, il y a bien un retour comme quoi ftp_put a fonctionné mais sur filezilla, le fichier devrait faire désormais 200ko, il faisait toujours 100ko (le fichier n'a pas changé, après vérification en downloadant ce fichier en local depuis filezilla). Si je tente un 3e envoi, ftp_put retourne une erreur, normal j'essaie d'envoyer des infos à partir du 200000e octet sur le fichier distant alors que celui ci n'en fait que 100000.
Si je supprime le paramètre startpos de ftp_put, il n'y a pas de souci, il y a bien un fichier de 100ko différent à chaque boucle sur filezilla.
Avec la fonction ftp_nb_put, même résultat.
Avant de créer à distance autant de fichiers que de morceaux (en créant par exemple le_fichier_a_envoyer.0, le_fichier_a_envoyer.1, ...) sur le serveur FTP, ce qui serait très ch... à la lecture lorsqu'on fouillera le dossier via filefilla (imaginez plusieurs fichiers de 200Mo coupés en fichiers de 100ko !), avez vous une solution ?
Un grand merci d'avance à ceux qui vont m'empêcher de finir chauve
Partager