Terrible duda con flash php,mysql campos BLOB

105 views
Skip to first unread message

Miguel Merín

unread,
Oct 29, 2009, 2:56:04 PM10/29/09
to asna...@googlegroups.com
Hola a todos.

Acabo de empezar en el incomprensible (para mi) mundo  de AS3 y tengo un problemón. No consigo que se muestren todos los campos BLOB de imagen que he ido almacenando en una base Mysql. La cosa es como sigue:
1- pintas . Con una clase que se llama PizarraBásica que hizo esta gente tan maja de esedeerre:

http://www.esedeerre.com/ejemplo/9/117/como-hacer-una-pizarra-en-actionscript-30

2- El archivo se guarda como un snapshot que va a ser codificado en Base64 y enviado por POST a un php que inserta los datos binarios en un campo blob que se llama "imagen".


Este es el código de este SWF:

Pinta.fla

// importamos clases necesarias

import com.adobe.images.*;
import com.dynamicflash.util.Base64;
import fl.data.DataProvider;
import PizarraBasica;
// contador incremental para el nombre de archivo
var img_count:uint=0;
guardar_mc.addEventListener(MouseEvent.CLICK, crearIMG);

// --------------------------------------------------------------

function crearIMG(e):void {
    capturarIMG(muro,"PNG");
}


function capturarIMG(target:DisplayObject, tipo:String):void {
    img_count++;

    // dirección de la url PHP

    var phpCreator:URLRequest = new URLRequest("crearIMG.php");
    phpCreator.method = URLRequestMethod.POST;
    // objeto que contendrá los datos a enviar
    var datosPOST:URLVariables = new URLVariables();
    // rutinas para capturar el área deseada, en nuestro caso el clip shirt_mc
    var relative:DisplayObject = target.parent;
    var rect:Rectangle =target.getBounds(relative);
    // borde en píxeles que se añade alrededor de la imagen
    var bordeImagen:uint=1;
    var bitmapData:BitmapData = new BitmapData(rect.width + bordeImagen * 1, rect.height + bordeImagen * 1);

    // capturamos la imagen

    bitmapData.draw(relative, new Matrix(1, 0, 0, 1, -rect.x + bordeImagen, -rect.y + bordeImagen));
    var byteArray:ByteArray;
    switch (tipo)  {
      case "PNG":
          datosPOST.nombreArchivo="imagen"+img_count+".png";
          byteArray = PNGEncoder.encode(bitmapData);
          break;
   }

   // codicamos en Base64

    var byteArrayAsString:String = Base64.encodeByteArray(byteArray);
    // rellenamos el objeto contenedor con los datos a enviar
    datosPOST.image = byteArrayAsString;
    datosPOST.tipo=tipo;
    phpCreator.data = datosPOST;
    // enviamos los datos
    navigateToURL(phpCreator, "_self");
}


// Instanciamos la clase
var pizarra1:PizarraBasica = new PizarraBasica();

// Añadimos al Stage el clip
addChild(pizarra1);


function init()
{   
    // this creates an instance of the library MovieClip with the
    // name, "MyCursorClass".  this contains your mouse cursor art
    //
    myCursor = new MyCursorClass();
 
    // you'll want to make sure the child is added above everything
    // else, possibly in its own container
    //
    addChild(myCursor);
 
    // respond to mouse move events
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}
 
function mouseMoveHandler(evt:MouseEvent):void
{
    // whenever the mouse moves, place the cursor in the same spot
    myCursor.x = evt.stageX;
    myCursor.y = evt.stageY;
}

stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveHandler);
 

function mouseLeaveHandler(evt:Event):void
{
    myCursor.visible = false;
   
}




Y este es el php que recibe la imagen y la inserta en la base.

//  crearIMG.php

<?php
$unaimagen= $_POST["image"];
$nombrearchivo = $_POST["nombreArchivo"];
$conectame=new mysqli("localhost", "xxx","xxx","xxx");
$miquery = "insert into art values ('', '".$nombrearchivo."', 'unaimagen', '".$unaimagen."')";

$resultao = $conectame->query($miquery);
 
$miqueryrespuesta="SELECT `art`.`imagen` FROM `art` ORDER BY `ID` DESC";
$resultao2 = $conectame->query($miqueryrespuesta);



// La imagen

 while ($row = mysqli_fetch_array($resultao2))
        {header('Content-Type: image/png');
        $muestra= base64_decode($row["imagen"]);
        echo $muestra;}
    $conectame->close();

?>




Hasta aquí todo funciona (las imagenes se insertan bien y después puedo ver el binario en php con una conexión mysqli.



//  muestraimagenes.php

<?php

$conectame=new mysqli("localhost", "xxx","xxx","xxx");

$miquery="SELECT `art`.`imagen` FROM `art` ORDER BY `ID` ASC";
$resultao2 = $conectame->query($miquery);



 while ($row = mysqli_fetch_array($resultao2))
        {
        $muestra= $row["imagen"];
        echo $muestra  //aquí metí varios "<br>" entre "chorizos" binarios para verlo en php.
        }


    $conectame->close();




, pues bien, mi problema viene cuando intento recuperar esas imágenes de la base y mostrarlas en flash.
Parece que Flash solo puede leer el primer elemento -o el último- del array binario que le mando. Y aunque lo decodifica y lo muestra bien (la imagen se ve), ¡solo me saca el primero!.


// muestra.fla

import com.adobe.images.*;
import com.dynamicflash.util.Base64;
import fl.data.DataProvider;

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
var bin = new URLRequest("muestraimagenes.php");
loader.load(bin);
loader.addEventListener(Event.COMPLETE, varsLoaded);
displayBMP= new Loader();

function varsLoaded(event:Event):void {
        var decoded:ByteArray = Base64.decodeToByteArray(loader.data);
        displayBMP.loadBytes(decoded);
        displayBMP.x+=60;
            addChild(displayBMP);
        }




Ah, y al probar la película me tira este error tan petardo...


Error #2044: IOErrorEvent no controlado: text=Error #2124: El archivo cargado es de tipo desconocido.


Estoy atascadísimo porque parece que flash ha entendido el binario y lo ha decodificado, no sé porque no continúa con las otras dos imágenes que hay en la base.

¿Tendré que ponerle otro bucle a Flash para que vaya decodificando cada elemento que le llega?. El caso es que lo he intentado con un while

while(loader.data){

var decoded:ByteArray = Base64.decodeToByteArray(loader.data);

displayBMP.loadBytes(decoded);
....

}


Pero esto lo cuelga y no muestra nada.

¿Por qué dice que el archivo es de tipo desconocido si luego lo puede mostrar como imagen png, perfectamente?

Arfffsss, ¿alguna idea de qué le pasa con el resto de datos que le paso al loader?

Muchas gracias , aunque sea por oirme en confesión, jjeje.

Miguel









Cay

unread,
Oct 29, 2009, 3:29:38 PM10/29/09
to asna...@googlegroups.com
Uhm, entiendo que estas enviando varias imagenes a la vez (en la misma llamada) no? Como binario no creo que se pueda (a menos que envies un zip o algo similar y luego en flash lo desempaquetes), pero como BASE64 supongo que sí (BASE64 segun entiendo es un string, no un binario).
En todo caso, si envias base64, de alguna manera debes crear un array en php (separando por comas por ejemplo) y en flash rearmar el array y crear tantos bytearrays como elementos del array haya, y luego crear tus imagenes en distintos loaders...

Luego veo cosas raras en todas las conversiones que estas haciendo de base64 a binario y viceversa... entiendo que estas guardando como binario en la base de datos, y lo envías a flash tal cual, pero luego en flash haces denuevo la conversión base64 a bytearray. Pero bueno, si te muestra la primera imagen supongo que no importará :)

Saludos!

2009/10/29 Miguel Merín <migue...@gmail.com>

miguel

unread,
Oct 29, 2009, 5:38:16 PM10/29/09
to ASNativos - Lista de Actionscript
Oye, muchísimas gracias por responder.
Pues sí, son tres imágenes en la misma llamada, las que hay en la base
de momento.

Entonces supongo que el error que me tira

Error #2044: IOErrorEvent no controlado: text=Error #2124: El archivo
cargado es de tipo desconocido.

Es porque al loader le he dicho que lo que tiene que traer es binario,
y BASE64 es String...

loader.dataFormat = URLLoaderDataFormat.BINARY;

madre mía que ignorancia la mía, jej.
aun así parece que se lo ha tragado...

Lo de pasarlo a bytearray era para luego usar el metodo loadBytes

displayBMP= new Loader();
displayBMP.loadBytes(decoded);

que parece que va de maravilla (rápido), pero claro, si le mando al
pobre flash todo del tirón sin clasificar y con el tipo de datos
forzado (en el php solo tengo un fetch_array del resultado de la
consulta), se vuelve loco. Tienes toda la razón.
Eso me pasa por tirar de reciclaje.

> En todo caso, si envias base64, de alguna manera debes crear un array en php
> (separando por comas por ejemplo) y en flash rearmar el array y crear tantos
> bytearrays como elementos del array haya, y luego crear tus imagenes en
> distintos loaders...

Entonces...tendré que hacer - además del bucle para montar el array en
php- uno en flash para que asocie cada elemento a un loader , ya,
ya...
te agradezco muchísimo la ayuda, porque me estaba planteando pasar de
la historia del campo blob y guardar mis imágenes en disco, almacenar
en la base solo la url para cargarla luego en flash y a tomar
viento...pero gracias a ti y ¡igual lo saco!.

Pues la gracia es una especie de muro virtual en el que se puede
pintar pasando por un formularito de datos personales y el dibujo
queda ahí expuesto, es una bonita idea para un bichazo... A ver si
sale. bueno muchas gracias, probaré y te cuento.



Reply all
Reply to author
Forward
0 new messages