JavaScript para pasar múltiples jpegs de Flash (AS3) a PHP

Tengo el siguiente código AS3 que convierte un montón de capturas de pantalla de BitMap en jepgs siguiendo una solicitud del usuario. (sourceArray almacena los mapas de bits originales).

for (var i:int=0; i<sourceArray.length; i++)
    {
    var jpgEncoder:JPGEncoder = new JPGEncoder(10);
    var jpgStream:ByteArray = jpgEncoder.encode(sourceArray[i]);
    var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");     
    var jpgURLRequest:String = new String("videoprocess.php?name=drawing" + i +".jpg");
    jpgURLRequest.requestHeaders.push(header);
    jpgURLRequest.method = URLRequestMethod.POST;
    jpgURLRequest.data = jpgStream;
    ExternalInterface.call("openWindow", jpgURLRequest );

Mi código PHP para guardar estos jpegs es el siguiente:

 <?php
 if ( isset ( $GLOBALS["HTTP_RAW_POST_DATA"] ) && isset ( $_GET['name'] ) ) {

//the image file name
$fileName = time();

// get the binary stream
$im = $GLOBALS["HTTP_RAW_POST_DATA"];

//write it
$fp = fopen($fileName, 'wb');
fwrite($fp, $im);
fclose($fp);
}
?>

Usando la llamada externalinterface.call anterior, estoy tratando de pasar jpegs individuales al archivo PHP para guardarlos en cada vuelta del bucle, pero hasta ahora no he podido pasar jpgURLRequest como un objeto. ¿Alguien sería lo suficientemente amable como para arrojar luz sobre el código JS que sería necesario para pasar el jpeg de AS3 a PHP? Muchas gracias.

preguntado el 21 de mayo de 12 a las 19:05

1 Respuestas

No veo por qué querrías usar Javascript para pasar los datos binarios de Flash a PHP. Puedes hacer eso desde as3 usando Cargador de URL y Solicitud de URL y configurando el método para "publicar". El código que debe agregar se ve así:

var urlRequest = new URLRequest(jpgURLRequest);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = jpgStream;
urlRequest.requestHeaders = new Array(header);
var urlLoader = new URLLoader();
urlLoader.load(urlRequest);
//depending if you want to do something with the response you can add event listeners

Espero eso ayude.

ACTUALIZACIÓN Si desea enviar las solicitudes en orden, debe comenzar definiendo una variable global: var index:int=0 y definir una función:

function loadSource() {
var jpgEncoder:JPGEncoder = new JPGEncoder(10);
var jpgStream:ByteArray = jpgEncoder.encode(sourceArray[index]);
//... rest of your code here  
var urlRequest = new URLRequest(jpgURLRequest);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = jpgStream;
urlRequest.requestHeaders = new Array(header);
var urlLoader = new URLLoader();
urlLoader.load(urlRequest);
urlLoader.addEventListener(Event.COMPLETE,completeEventListener);}

function completeEventListener(e:Event)
{
  index ++;
  if (index<sourceArray.length) loadSource();}

contestado el 21 de mayo de 12 a las 20:05

Muchas gracias por la sugerencia. Cuando integré su código en el mío y ejecuté la aplicación en mi servidor local, solo la captura de pantalla final se envía a PHP y se guarda. Creo que esto puede tener algo que ver con que urlLoader solo pueda ejecutarse una vez por cuadro. ¿Conoces alguna forma de evitar esta limitación? - dirk_22

No conozco tal limitación. Tal vez el servidor guarde los archivos con el mismo nombre (como veo que usas time()). Para verificar, puede intentar agregar una secuencia aleatoria de caracteres en el nombre o enviar el nombre en la solicitud (ya sea como GET agregando ?name=blabla o como encabezado de solicitud). - Mircea

Acabo de usar GET para modificar los nombres de los archivos según su sugerencia, pero aún no tuve suerte. He leído aquí (stackoverflow.com/questions/3703962/…) que urlLoader es asíncrono y, por lo tanto, no funciona bien en los bucles, ¿podría ser este el problema? - dirk_22

La solución que veo para superar esto (aunque todas las solicitudes deberían llegar al servidor) es en lugar de usar un for para iterar a través de sourceArray, implementar un detector de eventos completo y cada vez que se llama para enviar el siguiente elemento de sourceArray. Actualizaré la respuesta con el código correspondiente para que quede más claro. - Mircea

¡Fabuloso! Ahora veo todas las imágenes capturadas enviadas correctamente a mi script php y descargadas al servidor. Realmente no puedo agradecerles lo suficiente por toda su ayuda, ¡me alegraron el día! - dirk_22

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.