2012-09-10 11 views
6

Estoy cargando un archivo con XMLHttprequest. Aquí está la función JS, que carga un archivo:Carga de un archivo con XMLHttprequest - Falta el límite en multipart/form-data

var upload = function(file) { 
    // Create form data 
    var formData = new FormData(); 
    formData.append('file', file); 

    var xhr = new XMLHttpRequest(); 

    // Open 
    xhr.open('POST', this.options.action); 

    // Set headers 
    xhr.setRequestHeader("Cache-Control", "no-cache"); 
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
    xhr.setRequestHeader("X-File-Name", file.fileName); 
    xhr.setRequestHeader("X-File-Size", file.fileSize); 
    xhr.setRequestHeader("X-File-Type", file.type); 

    // Send 
    xhr.send(formData); 
} 

En el lado del servidor, en upload.php leí el archivo de esta manera:

file_put_contents($filename, (file_get_contents('php://input'))); 

Todo funciona bien, excepto que Me aparece una advertencia de PHP:

Missing boundary in multipart/form-data POST data in Unknown on line 0.

Si elimino esta línea: xhr.setRequestHeader("Content-Type", "multipart/form-data");, la advertencia desaparece.

¿Cuál debería ser el problema aquí?

+1

Intenta usar 'application/x-www-form-urlencoded' como tipo de contenido. O déjalo fuera, ya que este es el tipo de contenido predeterminado enviado por una solicitud de AJAX. –

+1

Esto puede funcionar, pero para archivos grandes (incluso 5-600 KB) el navegador se congelará porque tiene que enviar el archivo en un formato de "texto". Tengo que usar el 'multipart/form data'. –

+2

Lo sentimos, se pasó por alto el bit de carga de archivos (no sé cómo), pero [creo que esto podría responder a su queston] (http://stackoverflow.com/questions/5933949/how-to-send-multipart-form- data-form-content-by-ajax-no-jquery), más específicamente: 'xhr.setRequestHeader (" content-type "," multipart/form-data; charset = utf-8; boundary = "+ Math.random () .toString(). substr (2)); 'debería hacer el truco –

Respuesta

8

Bueno, esto es un poco extraño para mí, pero esto es lo que ha funcionado:

// Open 
xhr.open('POST', this.options.action, true); 

// !!! REMOVED ALL HEADERS 

// Send 
xhr.send(formData); 

En este caso, en el lado del servidor no leo el archivo enviado a través de php://input pero el archivo estará en la matriz $_FILES.

Esto resolvió mi problema, pero todavía tengo curiosidad por qué aparece ahora el archivo en $_FILES?

Probado en Chrome, Mozilla, Safari e IE10.

+8

[La especificación] (http://www.w3.org/TR/XMLHttpRequest/#the-send-method) explica (punto 3) que el navegador establece los encabezados correctos (incluida la correcta indicación de frontera de varias partes en el Contenido- Escriba) si no ha especificado nada manualmente. El archivo aparece en '$ _FILES' porque PHP [automáticamente coloca los archivos de las cargas de formulario multiparte en ese superglobal] (http://www.php.net/manual/en/features.file-upload.post-method.php). – Gijs

+0

Gracias por ayudarme a entender esto. –

+0

eliminado el 'multipart/form-data' solo ha funcionado. – ulab

Cuestiones relacionadas