Faire de l'upload en Ajax
De Typo3 CMS / Documentation Typo3 / Support Typo3.
Uploadify
Uploadify est un plugin jQuery servant à l'upload asynchrone (ajax) de fichiers. Il dispose notamment d'une barre de progression et permet l'upload multiple.
Retrouvez la documentation ici: http://www.uploadify.com/documentation/
Sommaire |
Utilisation
Téléchargez le package ici et décompressez les sources dans le répertoire web. Vous pouvez inclure uploadify dans vos pages de la manière suivante :
<script type="text/javascript" src="/uploadify/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="/uploadify/swfobject.js"></script> <script type="text/javascript" src="/uploadify/jquery.uploadify.v2.1.4.min.js"></script>
Ensuite, vous pouvez initialiser une ou plusieurs balises input[type="file"] de la manière suivante : Sans oublier d'adapter les chemins et l'id de l'input.
<script type="text/javascript"> $(document).ready(function() { $('#id-input-file').uploadify({ uploader : '/uploadify/uploadify.swf', script : '/uploadify/uploadify.php', cancelImg : '/uploadify/cancel.png', //folder : '/uploads', auto : true }); }); </script> <!--// Exemple d'input : --> <input id="id-input-file" name="file_upload" type="file" />
Remarque : On s'abstient d'utiliser le paramètre folder ici car il laisse la possibilité à l'utilisateur de spécifier le chemin du répertoire d'upload. Le script /uploadify/uploadify.php utilise vraiment ce paramètre et créer donc une faille de sécurité majeur, l'exemple ne dois pas être reproduis.
Utilisation dans TYPO3, avec eID
Ceci est un exemple de comment mettre uploadify en place dans le contexte TYPO3 : utilisation des eID pour les performances et du flashVerifCode qui permet d'identifier le fe_user même au travers d'uploadify.
A adapter à vos besoins, notamment au niveaux des callbacks javascript et des actions à faire en PHP une fois le move_uploaded_file effectué.
Commencez par l'initialisation dans votre template :
<script type="text/javascript"> $(document).ready(function() { $('#file_upload').uploadify({ uploader : '/uploadify/uploadify.swf', script : '/?eID=tx_myext_upload', cancelImg : '/uploadify/cancel.png', fileExt : '*.jpeg;*.jpg;*.gif;*.png', //Ici on autorise que les images scriptData : { 'fe_typo_user': getCookie('fe_typo_user'), 'vC': '###FLASH_VERIFCODE###' }, //Callbacks onSelect : function(event,ID,fileObj){ console.log('onSelect', event); return false; }, onOpen : function(event, ID, fileObj){ console.log('onOpen', event); }, onComplete: function(event, ID, fileObj, response, data){ console.log('onComplete', event); }, onError : function (event,ID,fileObj,errorObj) { console.log('onError', event); //Error type var errorText = ''; switch(errorObj.info){ case 403 : //403 Forbidden window.location.replace("###PAGE_BASEHREF###"); break; case 413 : //413 Request Entity Too Large errorText = fileObj.name+' est trop gros.'; break; case 415 : //415 Unsupported Media Type errorText = fileObj.name+' est d\'un type non-autorisé.'; break; case 500 : //500 Internal Server Error errorText = fileObj.name+' n\'a pas été envoyé à cause d\'une erreur interne.'; break; } //Alert!! if(errorText.length > 0){ alert(errorText); } } }); }); //@see: http://www.w3schools.com/js/js_cookies.asp function getCookie(c_name) { var i,x,y,ARRcookies=document.cookie.split(";"); for (i=0;i<ARRcookies.length;i++) { x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")); y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1); x=x.replace(/^\s+|\s+$/g,""); if (x==c_name) { return unescape(y); } } } </script>
Remarque : Le marker ###FLASH_VERIFCODE### doit étre remplacer par la valeur de $TSFE->fe_user->veriCode().
Ensuite à vous de coder l'eID :
<?php //Vérifie que la page est appelée dans un contexte typo3 if (!class_exists('tslib_eidtools')) { die(); } //Upload tx_monext_eid_Upload( 16 * 1024 * 1024, array('jpeg', 'jpg', 'gif', 'png') ); function tx_monext_eid_Upload($maximumSize, $allowedExtensions){ global $TSFE; //User auth verif if (isset($TSFE->fe_user->user) && !empty($TSFE->fe_user->user) && !empty($_FILES)) { //File size verification if($_FILES['Filedata']['size'] <= $maximumSize) { //File extension verification $fileExt = strtolower(substr(strrchr($_FILES['Filedata']['name'],'.'),1)); if(in_array($fileExt, $allowedExtensions)) { //Store file as a temp file $prefix = substr($_FILES['Filedata']['name'], 0, -1*(strlen($fileExt)+1)); $destination = t3lib_div::tempnam($prefix).'.'.$fileExt; if(move_uploaded_file($_FILES['Filedata']['tmp_name'], $destination)) { //Return file path echo $destination; } else { tx_monext_eid_UploadError('move_file'); } } else { tx_monext_eid_UploadError('file_extension'); } } else { tx_monext_eid_UploadError('file_size'); } } else { tx_monext_eid_UploadError('user_login'); } } function tx_monext_eid_UploadError($err){ switch($err){ case 'user_login' : header(t3lib_utility_Http::HTTP_STATUS_403); //403 Forbidden $txt = 'You have to be a registered user to upload.'; break; case 'file_size' : header(t3lib_utility_Http::HTTP_STATUS_413); //413 Request Entity Too Large $txt = 'File is too large.'; break; case 'file_extension' : header(t3lib_utility_Http::HTTP_STATUS_415); //415 Unsupported Media Type $txt = 'File extension is not allowed.'; break; case 'move_file' : header(t3lib_utility_Http::HTTP_STATUS_500); //500 Internal Server Error $txt = 'Upload failed for internal reasons.'; break; } echo $txt; } /** * Singleton for t3lib_basicFileFunctions * @see t3lib_basicFileFunctions */ function tx_monext_eid_getBasicFileFunctionObj(){ static $obj = null; if(is_null($obj)){ $obj = t3lib_div::makeInstance('t3lib_basicFileFunctions'); } return $obj; }
On n'oubliera pas de déclarer l'eID via le ext_localconf.php de l'extension.
Securité et performance
Le fichier "/uploadify/uploadify.php" est fourni pour exemple, comme ce fichier est une faille de sécurité, on prendra soin de le supprimer immédiatement, et de ne jamais le mettre sur les serveurs de productions.
