2011-09-29 6 views
5

Después de un estudio conjunto días de & & tratando, que finalmente renunciar a subir archivos por pura AJAX (ps: este post How can I upload files asynchronously with JQuery? enterrada mi última esperanza)¿Por qué no puedo subir archivos de forma asíncrona?

Mi pregunta puede ser un poco sin sentido, pero todavía quiero ¿Sabes por qué ajax (o XMLHttpRequest) no puede manejar esto? ¿Por qué los archivos no se transfieren como la httprequest real?

+2

Porque JavaScript no puede leer archivos locales, al menos no sin la ayuda de algunos API de HTML 5. –

+0

@PeKKa Eso significa que la solicitud de AJAX (con js) y la solicitud de formulario (con html) son cosas totalmente diferentes. Incluso para los navegadores? – rhapsodyn

+2

no realmente, puedes crear cualquier tipo de solicitud usando Ajax. Es solo acceder al archivo local que no es posible en JavaScript por razones de seguridad. –

Respuesta

6

Javascript no puede leer archivos locales por razones de seguridad, por lo que no podemos enviar los datos utilizando AJAX.

Sin embargo, puede PUBLICAR un formulario HTML estándar y establecer el destino del formulario como un iframe invisible en la página. Este iframe puede usar el código del lado del servidor para manejar la carga.

Si su razón para usar AJAX es porque desea una barra de progreso a medida que se carga el archivo, utilizando este método puede usar una variable estática del lado del servidor para almacenar el progreso de la carga del archivo, luego use AJAX para haga una solicitud simple y programada a otra página HTTP que simplemente devuelve el progreso de la carga.

2

Al igual que una respuesta actualizada en caso de que alguien lo haga, el nivel 2 de XMLHttpRequest admite la presentación de archivos AJAX.

apoyo del navegador:

http://caniuse.com/xhr2

Utiliza el objeto FormData Javascript.

How to send FormData objects with Ajax-requests in jQuery?

No se olvide de apagar processData y contentType si está haciendo esto.

var fd = new FormData();  
fd.append('file', input.files[0]); 

$.ajax({ 
    url: 'http://example.com/script.php', 
    data: fd, 
    processData: false, 
    contentType: false, 
    type: 'POST', 
    success: function(data){ 
    alert(data); 
    } 
}); 
Cuestiones relacionadas