Téléchargement fichier protégé

WRInaute occasionnel
Bonjour,

Je souhaiterai télécharger et enregistrer dans un répertoire de mon site un fichier .csv qui est accessible via une url d'un autre site (ce site étant protégé par un accès login et mot de passe, je possède bien sur ce login et mot de passe), comment faire cela ?

Je souhaite enregistrer ce fichier .csv dans un de mes répertoires afin de mettre à jour automatiquement une table de ma base de données via un script php.

Quelqu'un voit-il une solution ?

Merci pour vos réponses.
 
WRInaute passionné
si le fichier est protégé par htpassword, tu peux récupérer le fichier avec l'instruction file et l'url sous la forme : http://user:password@example.com/repertoire/fichier.csv

sinon, il faut utiliser la librairie php curl et appeler la page de login puis celle pour récupérer le fichier avec les cookies. C'est plus compliqué. J'ai déjà fait ca pour récupérer les liens externes sur l'outil pour webmasters de google. Le code est visible ici : -http://www.phpsources.org/scripts314-PHP.htm
 
WRInaute occasionnel
Merci beaucoup webmasterlamogere ta solution avec l'instruction file et l'url sous la forme http://user:password@example.com/repertoire/fichier.csv marche parfaitement, je ne sais pas pourquoi mais http://user:password@example.com/repertoire/fichier.csv ne marchait pas alors que http://user:password@www.example.com/re ... ichier.csv fonctionne parfaitement !

1) Est-ce que tu peux m'aider à construire mon script php, le fichier .csv dont j'ai accès avec l'url du style http://user:password@www.example.com/re ... ichier.csv possède des milliers de lignes (plus de 40000), je ne peux donc charger toutes ces données d'un seul coup dans ma table, comment faut-il faire pour charger ces données par bloc de 4000 ou 5000 lignes à le fois ?

2) Autre souci, la première ligne de ce fichier .csv correspond au nom des champs de ma table, il ne faut donc pas charger cette première ligne dans la table ! Comment sauter cette ligne ?
 
WRInaute passionné
regarde du côté de l'instruction mysql suivante :
LOAD DATA LOCAL INFILE '/repertoire_local/fichier.csv' INTO TABLE ta_table FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\' LINES TERMINATED BY 'n' IGNORE 1 LINES

-http://dev.mysql.com/doc/refman/5.0/en/load-data.html
 
WRInaute occasionnel
Merci webmasterlamogere.

Comment faire pour charger dans ma table d'abord les lignes de 2 à 2000 (on commence à 2 car on saute la ligne 1), puis de charger les lignes de 2001 à 4000, etc... jusqu'à la charger toutes les lignes du fichier .csv ?
 
WRInaute occasionnel
Ok merci.

J'ai un message d'erreur :
Erreur de syntaxe près de '' IGNORE 1 LINES' à la ligne 2

Voici ma requête :
$result = mysql_query("LOAD DATA LOCAL INFILE '$file' INTO TABLE $tableName FIELDS TERMINATED BY ',' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 1 LINES") or die (mysql_error());

Quelqu'un voit-il l'erreur ?
 
WRInaute passionné
pour moi c'est avec 4 \ pour "ESCAPED BY" et 2 pour "TERMINATED BY" :
$result = mysql_query("LOAD DATA LOCAL INFILE '$file' INTO TABLE $tableName FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES") or die (mysql_error());
 
WRInaute occasionnel
Merci pour ta réponse, ça va un peu mieux, j'ai plus ce message d'erreur mais j'ai maintenant ce message losque j'exécute ma requete :
Cette commande n'existe pas dans cette version de MySQL

J'ai phpMyAdmin 2.6.1 et MySQL 4.1.9-max sur mon serveur local, c'est pas suffisant ?
 
WRInaute accro
webmasterlamogere a dit:
si c'est pour un test en local, je te conseille d'installer WAMP
+1
Avant j'utilisais EasyPhp, mais Wamp te permet de basculer d'un seul click de version de php, de mysql ou d'apache.
Le pied quand tu dois développer pour plusieurs versions de plate forme
 
WRInaute accro
webmasterlamogere a dit:
je crois qu'EasyPHP n'est plus maintenu.
il me semble que si, vu les versions php mysql affichées sur leur site
Mais pour faire une install multi versions, WAMP est largement plus facile, surtout pour faire la bascule au vol.
 
WRInaute occasionnel
Ok merci pour vos réponses.

Bon finalement j'ai opté pour une version plus récente de EasyPHP, je l'ai donc installé sur mon ordi et j'ai la version MySQL: 5.0.22 qui est installé, je n'ai plus la phrase
Cette commande n'existe pas dans cette version de MySQL
mais j'ai ce message d'erreur
File 'Resource id #5' not found (Errcode: 2)
quelqu'un a-t-il une idée pour résoudre cette erreur ?
 
WRInaute passionné
il y a deux solutions :
- le fichier indiqué n'existe pas
- il faut utiliser la commande sans indiquer 'LOCAL'

L'option LOCAL est a ajouter si le serveur mysql ne se trouve pas sur la même machine que le serveur apache. Si tu fais le test en local les deux sont normalement au même endroit.
 
WRInaute occasionnel
Merci webmasterlamogere.

Toujours ces foutus erreurs : c'est pas possible !

J'ai téléchargé sur mon ordinateur le fichier en .csv que je veux mettre dans ma table, j'importe ce fichier via le formulaire d'importation de mysql "Format du fichier d'importation" => "CSV via LOAD DATA" et tout se passe bien, les données sont chargées dans la table : tout fonctionne parfaitement ! Je fais un copier-coller de cette requête et je remplace le LOAD DATA LOCAL INFILE 'C:\\PROGRA~1\\EasyPHP\\\\tmp\\phpEA39.tmp' par LOAD DATA LOCAL INFILE '$file' le $file correspond à l'url distante ou je souhaite télécharger ces données du type http://login:password@www.site-web.com/ ... ngs/etc.... et là ça ne marche plus j'ai cette erreur :
Erreur de syntaxe près de '' à la ligne 1

Voici ma requête :
$result = mysql_query("LOAD DATA LOCAL INFILE '$file' INTO TABLE `$tableName` FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES (** nom de mes champs séparés par des virgules du style : champs1, champs2, champs3, etc... **)") or die (mysql_error());

Voyez-vous quelque chose qui va pas ?
 
WRInaute passionné
c'est normal car il faut récupérer le fichier en local d'abord :
Code:
file_put_contents($fichierlocaltmp, file_get_contents($fichierdistantprotege));
 
WRInaute passionné
$fichierlocaltmp fait référence à un fichier local (sur ton serveur)
tu peux mettre par exemple :
Code:
$fichierlocaltmp = 'fichier.csv';  // fichier dans le répertoire courant
$fichierdistantprotege = 'http://login:password@www.site-web.com/Download_Listings/etc....';
file_put_contents($fichierlocaltmp, file_get_contents($fichierdistantprotege));
$result = mysql_query("LOAD DATA LOCAL INFILE '$fichierlocaltmp' INTO TABLE `$tableName` FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES (** nom de mes champs séparés par des virgules du style : champs1, champs2, champs3, etc... **)") or die (mysql_error());
unlink($fichierlocaltmp); // supprime le fichier temporaire
 
WRInaute occasionnel
C'est bon j'ai trouvé, ça marche parfaitement, un grand merci webmasterlamogere pour ton aide et ta patience, tu peux pas imaginer à quel point je suis content :lol: :lol: d'avoir ce bout de script qui marche...
 
WRInaute occasionnel
Une petite question : j'utilise la fonction PHP readfile (par exemple : readfile('http://www.site.com/image.jpg'); ) dans un de mes scripts mais parfois si le serveur sur lequel je souhaite télécharger le fichier ne fonctionne pas ou est indisponible la fonction PHP readfile renvoie une belle erreur avec l'url du fichier que je souhaitai télécharger, comment faire pour qu'en cas d'erreur ou d'insdiponibilité du serveur je puisse afficher mon propre message d'erreur ?
 
WRInaute occasionnel
Merci beaucoup webmasterlamogere c'est exactement que je cherchais :lol:

Par contre, dans le message d'erreur
echo 'ton message d'erreur';
On peut mettre que du texte et pas de code html du style
echo '<p align="center"><font face="Arial" size="3">Un problème technique nous empêche d'afficher l'image, merci de ré-essayer ultérieurement !</font>';

Vois-tu une solution pour que le message d'erreur prenne en compte ce code html ?
 
WRInaute passionné
le principe du php c'est bien de générer une page html. tu peux donc bien mettre du code html dans l'echo. Il faut juste bien penser à mettre un \' à la place de ' dans le texte :
Code:
echo '<p align="center"><font face="Arial" size="3">Un problème technique nous empêche d\'afficher l\'image, merci de ré-essayer ultérieurement !</font>';
tu peux aussi écrire comme ça :
Code:
if (@readfile('http://www.site.com/image.jpg') === false) {
?>
  <p align="center"><font face="Arial" size="3">Un problème technique nous empêche d'afficher l'image, merci de ré-essayer ultérieurement !</font>
<?php
}
 
Nouveau WRInaute
Bonjour à tous.

J'ai essayé de suivre le code et voici ce que j'ai mis :

$fichierlocaltmp = 'fichier.csv'; // fichier dans le répertoire courant

$result = mysql_query("LOAD DATA LOCAL INFILE '$fichierlocaltmp' INTO TABLE `client` FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES (clccli, nosect, raison, nom, tel)") or die (mysql_error());
//unlink($fichierlocaltmp); // supprime le fichier temporaire

Et j'ai l'erreur suivante :

File 'client_secteur_3.csv.csv' not found (Errcode: 2)

SVP plait merci de m'aider je galère grave
 
WRInaute passionné
essaye de mettre cette ligne à la place de l'ancienne :
Code:
$fichierlocaltmp = dirname(__FILE__) . '/fichier.csv'; // fichier dans le répertoire courant
 
Discussions similaires
Haut