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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Utilisation de startpos avec ftp_put ou ftp_nb_put


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Utilisation de startpos avec ftp_put ou ftp_nb_put
    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 :
    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;
    	}
    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
    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";
    	}
    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
    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&eacute;");
    	}
    }
    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.

    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

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    est ce que le serveur FTP autorise de reprendre l'upload à la suite ?

    regarde les options du serveur avec la fonction http://php.net/ftp_get_option pour vérifier si FTP_AUTOSEEK est supporté par le serveur

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Oui FTP_AUTOSEEK retourne true donc ça a l'air d'être supporté

Discussions similaires

  1. Utiliser DirectX 9 avec C++Builder
    Par Olivier Constans dans le forum DirectX
    Réponses: 2
    Dernier message: 27/06/2005, 11h30
  2. utilisation de dll avec diverses compilateurs
    Par Thylia dans le forum C++
    Réponses: 30
    Dernier message: 21/10/2004, 16h30
  3. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  4. utilisation de fetch avec select
    Par arwen dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/06/2003, 10h03
  5. Utiliser Borland C++ avec Emacs sous Windows
    Par Eikichi dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 02/03/2003, 08h40

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