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>