• Archivo

Flash as3 crossdomain solucion ( fix )

Si alguna vez intentaste cargar una imagen usando flash actionscript 3 tal vez encontraste el problema de “crossdomain”,este problema aparece cuando un swf alojado en un servidor  intenta cargar una imagen que se encuentra en otro servidor.

Por ejemplo si tenemos imagen.jpg en un servidor de mediatemple y queremos que un swf que esta en un servidor de godaddy muestre esa imagen flash lanzara una excepcion (error) pidiendo un archivo de politicas de acceso, esto es el llamado “crossdomain policy file”.

La solucion usual es poner un archivo llamado “crossdomain.xml” en el directorio raiz del servidor que contiene la imagen.jpg (el servidor mediatemple del ejemplo anterior) asi flash automaticamente pedira el archivo crossdomain y si es correcto estara autorizado para descargar la imagen y mostrarla.

Este problema se complica cuando no tenemos el control del servidor que contiene las imagenes (ej. instagram) y por lo mismo no podemos crear un archivo crossdomain , para resolverlo la solucion es crear un script php asp o cualquier script que pueda ser ejecutado en el servidor en el que se encuentra nuestro swf (godaddy en nuestro ejemplo)  , este script debe de leer la imagen remota y entregarle el resultado a nuestro swf , de esta forma el swf no pedira el archivo crossdomain ya que esta realizando una solicitud a un script que esta alojado en el mismo servidor local.

Esta solucion me ha funcionado para mostrar imagenes de facebook, instagram, twitter y muchos otros.

El script php es asi para imagenes jpg (requiere de la extension curl activa en la configuracion de php) :

<?php

//www.motion.com.mx
$image_url = $_GET[‘img’];
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $image_url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

$image = curl_exec($ch);
curl_close($ch);

header(“Content-type: image/jpeg”);
print $image;
?>

Es muy básico y seguramente deberia ser modificado para evitar problemas de seguridad.

En flash en lugar de hacer esto :

var imageLoader:Loader = new Loader();
var image:URLRequest = new URLRequest(“http://cdn.facebook.com/algunaimagen2323423.jpg”);
imageLoader.load(image);
addChild (imageLoader);

 

Se cambia por esto :

var imageLoader:Loader = new Loader();
var puente:String = “obtenerimagen.php?img=”
var image:URLRequest = new URLRequest(puente+”http://cdn.facebook.com/algunaimagen2323423.jpg”);
imageLoader.load(image);
addChild (imageLoader);

 

Eso es todo , es posible modificar facilmente cualquier codigo en actionscript para usar este puente .

Estoy seguro que ayudara a muchos desarrolladores y les ahorrara tiempo de trabajo .

Leave a Reply

Your email address will not be published. Required fields are marked *