Problema con Adobe Flex Upload
25.02.2014 17:09
In un’applicazione di upload di files multipli in flex3 ho un problema: non mi passa allo script php la sessione corrente, la cosa strana di questo problema è che ciò non succede con internet explorer ma con firefox e safari (su altri non ho testato).
La soluzione a questo bug è facile:
Nello script flex aggiungiamo la classe che ho trovato nel seguente blog:
https://myflex.wordpress.com/2008/11/12/actionscript-cookie-util/
//code from myflex.wordpress.com package de.aggro.utils { import flash.external.ExternalInterface; public class CookieUtil { public function CookieUtil() { } private static const FUNCTION_SETCOOKIE:String = "document.insertScript = function ()" + "{ " + "if (document.snw_setCookie==null)" + "{" + "snw_setCookie = function (name, value, days)" + "{" + "if (days) {"+ "var date = new Date();"+ "date.setTime(date.getTime()+(days*24*60*60*1000));"+ "var expires = '; expires='+date.toGMTString();"+ "}" + "else var expires = '';"+ "document.cookie = name+'='+value+expires+'; path=/';" + "}" + "}" + "}"; private static const FUNCTION_GETCOOKIE:String = "document.insertScript = function ()" + "{ " + "if (document.snw_getCookie==null)" + "{" + "snw_getCookie = function (name)" + "{" + "var nameEQ = name + '=';"+ "var ca = document.cookie.split(';');"+ "for(var i=0;i < ca.length;i++) {"+ "var c = ca[i];"+ "while (c.charAt(0)==' ') c = c.substring(1,c.length);"+ "if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);"+ "}"+ "return null;" + "}" + "}" + "}"; private static var INITIALIZED:Boolean = false; private static function init():void{ ExternalInterface.call(FUNCTION_GETCOOKIE); ExternalInterface.call(FUNCTION_SETCOOKIE); INITIALIZED = true; } public static function setCookie(name:String, value:Object, days:int):void{ if(!INITIALIZED) init(); ExternalInterface.call("snw_setCookie", name, value, days); } public static function getCookie(name:String):Object{ if(!INITIALIZED) init(); return ExternalInterface.call("snw_getCookie", name); } public static function deleteCookie(name:String):void{ if(!INITIALIZED) init(); ExternalInterface.call("snw_setCookie", name, "", -1); } } }
2) In seguito richiamiamo lo script php dalla nostra applicazione flex passandogli la sessione:
Nel mio caso il file Mxml dell’applicazione è:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="https://www.adobe.com/2006/mxml" xmlns:com="com.flashdev.file.*" layout="absolute" creationComplete="initApp()" backgroundColor="#FFFFFF"> <mx:Script> <![CDATA[ import mx.controls.Alert; import com.utils.CookieUtil; private const _strDomain:String = "https://www.dominio.ext/"; [Bindable] private var _strUploadScript:String = new String("https://www.dominio.ext/flex_uploader.php"); // Initalize private function initApp():void { Security.allowDomain(_strDomain); //qui aggiungo la correzione al bug di firefox e Safari _strUploadScript += "?PHPSESSID=" + CookieUtil.getCookie("PHPSESSID"); // define the type list for the upload uploader.typeList = [new FileFilter("Image files (*.jpg, *.gif, *.png, *.pdf, *.zip, *.xls)", "*.jpg;*.gif;*.png;*.pdf;*.zip;*.xls", "JPEG;jp2_;GIFf;PNGf;PDF;ZIP;XLS")]; uploader.maxSize = 1048576; } ]]> </mx:Script> <mx:Canvas width="400" height="300" horizontalCenter="1" verticalCenter="1"> <com:FileList id="uploader" width="100%" height="100%" uploadUrl="{_strUploadScript}" uploadComplete="Alert.show('File(s) have been uploaded.', 'Upload successful')" uploadIOError="Alert.show('IO Error in uploading file.', 'Error')" uploadSecurityError="Alert.show('Security Error in uploading file.', 'Error')"/> </mx:Canvas> </mx:Application>