Ce mémo a pour objectif d'expliquer comment automatiser le transfert d'un fichier par FTP. Pratique lors de la création de passerelles.
Prérequis: un serveur FTP. Le compte FTP utilisé est chrooté dans le dossier dans lequel doivent être déposés les fichiers. Pour créer le serveur FTP, ce billet donne la solution.
Pour le moment, on va faire un truc simplissime:
Je crée 3 fichiers
script.bat est le script qui lancera le transfert. Il sera mis en tâches planifiées (pour ça, je vous laisse trouver comment on fait)
plannings_Extranet.ftp est la liste de commandes à éxécuter en FTP pour basculer les fichiers vers le repertoire FTP. Vous l'avez compris, la petite passerelle que je suis en train de faire a pour but de basculer les planings sur notre extranet.
Plop.txt est le fichier qui sera transféré; C'est juste pour le test hein!
script.bat
Il contient juste une ligne pour le moment.
ftp -s:planings_Extranet.ftp
Il lance le client dos ftp, qui prendra la liste d'instructions contenues dans le fichier planings_Extranet.ftp
planings_Extranet.ftp
open 192.168.10.253
user
password
prompt
lcd D:\testFtp
put plop.txt
quit
Explication ligne par ligne:
1 Ouvrir la connexion vers le serveur 192.168.10.253
2 Lui indiquer l'user FTP
3 Lui indiquer le mot de passe ftp
4 Attendre le prompt
5 Se placer localement dans le repertoire comprenant le(s) fichiers à transférer
6 envoyer le fichier
7 fermer la connexion
plop.txt
Bah, c'est le fichier à transférer; OSEF?
Lancez script.bat, vérifiez sur le serveur de destination si le fichier a bien été poussé.
Un peu plus compliqué; On va pousser tous les fichiers d'un répertoire et créer un fichier de logs.
Prérequis, télécharger curl
Pour se simplifier un peu la vie, cette fois, on va utiliser curl. Téléchargez l'éxécutable qui correspond à votre version de windows: http://curl.haxx.se/download.html
Je me créé l'architecture suivante sur le windows;
testFtp
script.bat
bin
curl.exe
license_curl.txt
toSend
fichier1.pdf
fichier2.pdf
fichier3.pdf
l'objectif est d'envoyer les fichiers (quelque soient leur noms) du dossier toSend sur notre ftp. Par contre si le fichier existe déja sur le serveur; je l'écrase.
Transfert automatique en écrasant les éventuels fichiers sur le serveur
Voici le contenu du scrip.bat
::Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
::Ce script utilise Curl (pour le ftp). La licence se situe dans le dossier bin
cls
::On met un titre au shell
@title Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
::Supprimer les retours écran
@echo off
::#### VARIABLES####
::PARTIE FTP
setuser_ftp=userFtP
setpwd_ftp=pwdFtp
setip_ftp=192.168.10.253
setpath_ftp=/
::DOSSIER LOCAL A TRANSFERER
setlocal_path=%cd%\toSend
::Définition des Chemins
::répertoire racine
setrep_root=%cd%
::chemin des binaires
setrep_bin=%cd%\bin
::chemin des fichiers de journaux
setrep_log=%cd%\log
::Si le ping est négatif, quitter et logguer
ping-n1%ip_ftp%
if%errorlevel%==1 goto NO_LINK_SERV
::On envoie
cd%local_path%
::Eventuellement, remplacez *.* par le filtre de votre choix genre planing-*.pdf dans la partie qui suit
C'est moche mais ça marche bien sur tous les windows (que le navigateur soit internet explorer ou firefox) tant que Adobe reader est installé. Au travail, ça marche bien sur tous les postes sauf le mien buhaaaa (linux). C'est assez frustrant d'avoir développé un truc (tout l'intranet) et de ne pas pouvoir l'utiliser.
Il y a d'autres solutions plus simples, mais qui font passer les documents par un service tiers. je souhaite assurer une certaine confidentialité de ces derniers.
Ce tutoriel/mémo va donc aborder l'installation un convertisseur pdf2swf sur le serveur, puis un "exec()" en php pour les convertir des leur upload.
Enfin, on verra vite fait l'utilisation de FlexPaperViewer pour les visionner sur une page web.
Les prérequis
Avoir la main sur le serveur. Un hébergement mutualisé ne suffira pas car on va devoir installer des paquets. A moins que l'hébergeur soit sympa. Me contacter pour un devis.
J'utilise une debian 5 sur le serveur de production, avec apache2 mysql, php5. Cependant les premiers essais, je les ai fait sur une fedora, ça marchera aussi très bien là dessus.
Installation de swftools à partir des sources
swftools contient les outils pour convertir un pdf en swf en ligne de commande.
En root sur le serveur, télécharger, extraire, compiler. la dernière version de swftools (à la date d'écriture de ce billet c'est la 0.9.1)
Télécharger et extraire
wget http://www.swftools.org/swftools-0.9.1.tar.gz
tar -zxvf swftools-0.9.1.tar.gz
rm swftools-0.9.1.tar.gz
Préparer la compilation
cd swftools-0.9.1/
./configure
Dans les retours du script configure, il faut vérifier que ça c'est bien passé. Dans mon cas il me prévient qu'il manque des dépendances:
***************************************************
* The following headers/libraries are missing: jpeglib ungif jpeglib.h freetype gif_lib.h
* Disabling pdf2swf tool...
* Disabling jpeg2swf tool...
* Disabling gif2swf tool...
***************************************************
et du coup il désactive justement le truc qui m'intéressait
Installer les dépendances manquantes (adaptez en fonction du retour de ./configure) Dans mon cas:
la conversion du fichier "fichier.pdf" en swf "fichier.swf" se fait pas la ligne de commande suivante:
pdf2swf fichier.pdf -o fichier.swf
Vous pouvez le tester en déposant le fichier sur un site web.
On sait donc à présent convertir un pdf en swf. Je vais me refaire du café avant d'attaquer la modification de mon script d'upload. Au passage, le script bash pour appliquer ce traitement à tous les pdf d'un repertoire:
#!/bin/bash# for element in*doif["${element##*.}" = "pdf"]then
pdf2swf $element -o ${element%.*}.swf
fidone
Ci dessous un exemple vite fait (que j'ai quand même pris le temps de valider au w3c validator). Cliquez sur le bouton pour le voir, je ne souhaitais pas alourdir ce billet [2] Sur l'intranet, il y a bien évidemment les vérifications comme qui l'utilisateur est identifié et a bien les droits.
l'exemple complet :
Vite fait un exemple (que j'ai quand même pris le temps de valider au w3c validator). Sur l'intranet, il y a bien évidemment les vérifications comme qui l'utilisateur est identifié et a bien les droits.
Le formulaire html basique
Le fichier testupload.php qui est appelé lors de la validation du formulaire.
<?php//name="fichieroriginal$content_dir=$_SERVER["DOCUMENT_ROOT"]."/documents/";// dossier où sera déplacé le fichier$tmp_file=$_FILES['file']['tmp_name'];//le nom du fichier temporaire qui vient d'etre uploadé (il sera supprimé automatiquement à la fin du script)if(!is_uploaded_file($tmp_file)){echo"Le fichier est introuvable";die;}// on vérifie maintenant l'extension$type_file=$_FILES['file']['type'];if(!strstr($type_file,'pdf')&&!strstr($type_file,'PDF')){exit("Le fichier n'est pas un PDF");}// on copie le fichier dans le dossier de destination$name_file=$_FILES['file']['name'];if(!move_uploaded_file($tmp_file,$content_dir.$name_file)){exit("Impossible de copier le fichier dans $content_dir");}exec('pdf2swf '.$content_dir.$name_file.' -o '.$content_dir.basename($content_dir.$name_file,'.pdf').'.swf');?>
Maintenant nos fichier sont tansformés lors de l'upload. Plus qu'à installer la visionneuse.
Et poussez tous les fichiers sur la racine de votre site.
Dans la page ou vous voulez visionner un document, débrouillez vous :p pour que le header (entre <head> et </head>) contienne:
<styletype="text/css"media="screen">
#flashContent { display:none; }
</style><scripttype="text/javascript"src="js/swfobject/swfobject.js"></script><scripttype="text/javascript">
if(window.addEventListener)
window.addEventListener('DOMMouseScroll', handleWheel, false);
window.onmousewheel = document.onmousewheel = handleWheel;
if (window.attachEvent)
window.attachEvent("onmousewheel", handleWheel);
function handleWheel(event){
try{
if(!window.document.FlexPaperViewer.hasFocus()){return true;}
window.document.FlexPaperViewer.setViewerFocus(true);
window.document.FlexPaperViewer.focus();
if(navigator.appName == "Netscape"){
if (event.detail)
delta = 0;
if (event.preventDefault){
event.preventDefault();
event.returnValue = false;
}
}
return false;
}catch(err){return true;}
}
function onExternalLinkClicked(link){
window.location.href = link;
}
</script><scripttype="text/javascript"><!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. -->
var swfVersionStr = "9.0.124";
<!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
var xiSwfUrlStr = "${expressInstallSwf}";
var flashvars = {
SwfFile : escape("http://www.tinaderp.com/tinaderp/fichiers.php?filename=CRA-BLA-003.swf"),
Scale : 0.6,
ZoomTransition : "easeOut",
ZoomTime : 0.5,
ZoomInterval : 0.1,
FitPageOnLoad : false,
FitWidthOnLoad : true,
PrintEnabled : true,
FullScreenAsMaxWindow : false,
ProgressiveLoading : true,
localeChain: "fr_FR"
};
var params = {
}
params.quality = "high";
params.bgcolor = "#ffffff";
params.allowscriptaccess = "sameDomain";
params.allowfullscreen = "true";
var attributes = {};
attributes.id = "FlexPaperViewer";
attributes.name = "FlexPaperViewer";
swfobject.embedSWF(
"FlexPaperViewer.swf", "flashContent",
"100%", "600",
swfVersionStr, xiSwfUrlStr,
flashvars, params, attributes);
swfobject.createCSS("#flashContent", "display:block;text-align:left;");
</script>
Et oui c'est dans le header qu'on définit le fichier qui sera visualisé. ça oblige de le générer en php pour pourvoir adapter la variable SwfFile : escape("votre fichier"),
Ensuite pour le placer sur la page, dans le body:
<divid="flashContent"><p>
To view this page ensure that Adobe Flash Player version
9.0.124 or greater is installed.
</p><scripttype="text/javascript">
var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://");
document.write("<ahref='http://www.adobe.com/go/getflashplayer'><imgsrc='"
+ pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif'alt='Get Adobe Flash player'/></a>" );
</script></div>
Comme indiqué dans le fichier d'exemple de FlexPaperviewer
Un screen soot du bouzin sur tinaderp (qui avance)
Nous allons voir comment purger un dossier avec un script .bat (pour windaube quoi)
Bon okie, j'ai honte d'écrire ce billet. Mais faut me comprendre, cette semaine, j'ai installé des PC, modifié le script d'interface laboratoire, tellement spécifique qu'il n'y a aucun intérêt à en faire un billet. j'ai ajouté une fonction de petites annonces à notre intranet. Ce code est sans grand intéret aussi, juste un appel mysql en PHP. Ça m'embêtait de ne poster que des conneries, et encore plus ne rien poster. Alors, même si c'est tout simple, le code batch pour purger un repertoire, c'est:
@echo off
ECHO O | DEL D:\INTRANETG\INTRANET\scanner\*.*
"Echo O" retourne "O" lorsque le DOS demande confirmation, dans une version anglaise il aurait fallu "echo Y".
Vous l'aurez compris, le dossier scanner, qui reçoit les éléments scannés, mais qui par soucis de configuration est accessible à tout le monde contient plein de trucs confidentiels. Gênant. Ce script est en tâche planifiée tous les soirs pour compenser.
Derniers commentaires