2012-09-04 18 views
6

Estoy intentando que SWFUpload cargue correctamente una imagen en mi servidor, junto con otros datos de publicación que deben venir con la imagen. Existe un formulario para completar los datos, por lo tanto, después de que el usuario haga clic en el botón Examinar y seleccione su archivo de imagen, la imagen no se cargará de inmediato. Se mantiene en la cola hasta que el usuario haga clic en un botón de envío, y luego llamo a mySwfUploadInstance.startUpload() para que comience la carga.SWFUpload startUpload() falla si no se llama dentro de file_dialog_complete_handler

pero fracasa estrepitosamente en la línea 452 de swfupload.js en la función 'callFlash':

Uncaught Call to ReturnUploadStart failed

La excepción ser capturado antes de lanzar este error es el siguiente:

Object #<HTMLObjectElement> has no method 'CallFunction'

en la siguiente función:

SWFUpload.prototype.callFlash = function (functionName, argumentArray) { 
    argumentArray = argumentArray || []; 

    var movieElement = this.getMovieElement(); 
    var returnValue, returnString; 

    // Flash's method if calling ExternalInterface methods (code adapted from MooTools). 
    try { 
     returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>'); 
     returnValue = eval(returnString); 
    } catch (ex) { 
     throw "Call to " + functionName + " failed"; 
    } 

    // Unescape file post param values 
    if (returnValue != undefined && typeof returnValue.post === "object") { 
     returnValue = this.unescapeFilePostParams(returnValue); 
    } 

    return returnValue; 
}; 

movieElement parece ser un objeto flash válido.

no consigo ese error si llamo startUpload() dentro de la función que pase a file_dialog_complete_handler al inicializar SWFUpload:

function ImageFileDialogComplete(numFilesSelected, numFilesQueued) 
{ 
    try 
    { 
     this.startUpload(); 
    } 
    catch (ex) 
    { 
     this.debug(ex); 
    } 
} 

que realmente necesita para ser capaz de posponer la carga a cuando el usuario completa el forma y haz clic en el botón enviar.

¿Alguna idea de lo que está mal con SWFUPload cuando llamo a StartUpload() fuera del controlador completo del diálogo?

Respuesta

14

Parece que el problema se debía a que estaba ocultando el div que contiene el objeto flash configurando la pantalla: ninguno en ella, justo antes de llamar a startUpload(). Estaba haciendo esto para ocultar el formulario y mostrar un div con una barra de progreso en su lugar.

Por alguna razón, el objeto flash debe permanecer visible en la pantalla, de lo contrario fallarían todas las llamadas realizadas.

+3

Gracias por publicar esta respuesta: me ha ahorrado muchas horas de depuración – Jeremy

+0

¿Ha obtenido una mejor solución? Necesito ocultar el contenedor después de subirlo. – Teddy

+0

Obtuve una mejor solución, en lugar de ocultar el contenedor, establezco el ancho y la altura del contenedor en 1px y bloque de visualización. – Teddy