Ver Mensaje Individual
  #6 (permalink)  
Antiguo 07/01/2015, 08:23
Charlie1
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 11 años, 1 mes
Puntos: 3
Respuesta: Problema subir archivo base64 con AJAX

Bueno ya lo solucioné hace unos días, os dejo lo que hice por si a alguien le es útil.

Básicamente cambié el reader para leer como binario en vez de como dataUrl.

Código:
//Aquí entramos para guardar el audio
        reader  = new FileReader();         

        reader.onload = function (e) 
        {
        // Enviamos el contenido del archivo de audio y lo codificamos para evitar errores al enviar vía HTTP
            data = reader.result;

            sendAudio(data, method, url, header);                    
            
        };

        // Leemos el archivo
        // reader.readAsDataURL(archivo); 
        reader.readAsBinaryString(archivo);
y depués dividí el archivo binario para luego codificarlo en base64 y subirlo al server, de esa forma ya no tuve problemas de fallos con el audio.


Código:
if ( ! working)
    {
        working = true;
        if (isNaN(b)) 
        {     
            var length = data.length,
            perPackage = 2000000,
            packages   = Math.ceil(parseInt(length)/perPackage),
            b = 0;
        }

        var req = createXMLHttpRequest(method, url, header),
        part = data.slice(perPackage * b, perPackage * (b + 1));

        ++b;

        req.setRequestHeader('processData', false);
        req.setRequestHeader('cache', false);
        //req.setRequestHeader('Content-Type', false);

        part = btoa(part);
        part = 'data:audio/wav;base64,' + part;

        req.send('sound=' + encodeURIComponent(part) + '&current=' + b /*+ '&packages=' + packages*/);

        if (b < packages)
        {

            req.onreadystatechange = function ()
            {
                if (req.readyState === 4 && req.status === 200)
                { 
                    working = false;              
                    sendAudio(data, method, url, header, length, perPackage, packages, b);
                }
            }; 
        }
        else
        {            
            req.onreadystatechange = function ()
            {
                if (req.readyState === 4 && req.status === 200)
                {    
                    working = false;             
                    stopSequenceRecording();
                }
            }; 
        }           
    }