banneer

Réducteur d'URL tinad:

Collez l'adresse du site:

Rechercher sur le blog du grouik:

Mot-clé - batch

Fil des billets - Fil des commentaires

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 scriptFTP.jpeg

  • 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.

  1. 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

  1. open 192.168.10.253
  2. user
  3. password
  4. prompt
  5. lcd D:\testFtp
  6. put plop.txt
  7. 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

  1. ::Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
  2. ::Ce script utilise Curl (pour le ftp). La licence se situe dans le dossier bin
  3. cls
  4. ::On met un titre au shell
  5. @title Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
  6. ::Supprimer les retours écran
  7. @echo off
  8.  
  9. ::#### VARIABLES####
  10. ::PARTIE FTP
  11. set user_ftp=userFtP
  12. set pwd_ftp=pwdFtp
  13. set ip_ftp=192.168.10.253
  14. set path_ftp=/
  15. ::DOSSIER LOCAL A TRANSFERER
  16. set local_path=%cd%\toSend
  17.  
  18. ::Définition des Chemins
  19. ::répertoire racine
  20. set rep_root=%cd%
  21. ::chemin des binaires
  22. set rep_bin=%cd%\bin
  23. ::chemin des fichiers de journaux
  24. set rep_log=%cd%\log
  25.  
  26. ::Si le ping est négatif, quitter et logguer
  27. ping -n 1 %ip_ftp%
  28. if %errorlevel%==1 goto NO_LINK_SERV
  29.  
  30. ::On envoie
  31. cd %local_path%
  32. ::Eventuellement, remplacez *.* par le filtre de votre choix genre planing-*.pdf dans la partie qui suit
  33. if exist ./*.* (
  34. FOR %%f IN (*.*) DO (
  35. ::Envoi de chaque fichier sur le ftp
  36. %rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD %path_ftp%" -T "%%f" ftp://%ip_ftp%/
  37. ::On logue les infos dans un fichier
  38. echo "%date%|%time:~0,2%h%time:~3,2% : fichier %%f -- envoyé " >>%rep_log%/envois.log
  39. )
  40. ::On supprime les fichiers après l envoi car on en a plus besoin
  41. del/Q *.*)
  42. GOTO FIN
  43.  
  44. :NO_LINK_SERV
  45. ::le serveur ne répond pas au ping
  46. echo "%date%|%time:~0,2%h%time:~3,2% : Le serveur FTP n'est pas joignable - Aucun transfert effectué" >>%rep_log%/connexions.log
  47.  
  48. :FIN
  49. ::On quitte

Plus qu'à mettre le script dans les tâches planifiées.


Dans la Gestion électronique de documents de mon intranet. j'affiche les documents en PDF sur la page web. J'utilise la balise HTML objet. comme ceci

<div style="height: 600px; width: 800px;">
        <object data="fichiers.php?filename=PRC-SOI-001.pdf" type="text/html" codetype="application/pdf" style="height: 600px; width: 800px;">
        </object>
</div>

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:

apt-get install libjpeg62-dev
apt-get install libgif-dev
apt-get install libfreetype6-dev

et réexutez le ./configure

./configure

Compiler:

make
make install

tester pdf2wfs

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 *
do
   if  [ "${element##*.}" = "pdf" ]
   then
	  pdf2swf $element -o ${element%.*}.swf
  fi 
done

Modification du script d'upload en php[1]

J'ajoute simplement la commande suivante à la fin pour que le script execute pdf2swf:

exec('pdf2swf '.$content_dir.$name_file.' -o '.$content_dir.basename($content_dir.$name_file, '.pdf').'.swf');

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 :

Maintenant nos fichier sont tansformés lors de l'upload. Plus qu'à installer la visionneuse.

Integration de FlexPaperviewer dans une page html

Dans la page ou vous voulez visionner un document, débrouillez vous :p pour que le header (entre <head> et </head>) contienne:

<style type="text/css" media="screen"> 
			#flashContent { display:none; }
        </style> 
<script type="text/javascript" src="js/swfobject/swfobject.js"></script>
		<script type="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>
 
        <script type="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:

<div id="flashContent">
	        		<p>
		        	To view this page ensure that Adobe Flash Player version
					9.0.124 or greater is installed.
				</p>
				<script type="text/javascript">
					var pageHost = ((document.location.protocol == "https:") ? "https://" :	"http://");
					document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='"
									+ 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) tinaderpgestdoc.jpg

Notes

[1] source: php-codeur Upload de fichiers

[2] Je progresse en javascript hein?


cmd.jpg 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.


Tous les billets taggués: batch

Propulsé par Dotclear