2009-06-24 13 views
16

Ok esto puede parecer una pregunta novata, pero muchos desarrolladores web que conozco no tienen una comprensión completa.Http and file uploading - ¿Cómo funciona realmente (bajo el capó)

Básicamente, ¿cómo se carga un archivo desde un cuadro de entrada de archivo de página web a un servidor web (que aloja un sitio .net por ejemplo) con un evento cargado del control FileUpload?

Según entendí, se realizó una publicación en el servidor que solicitaba una transmisión, que luego se pasa de vuelta al navegador y se inicia la transmisión de datos al servidor.

Mi amigo dice que entendió que todo el archivo está codificado en la solicitud de publicación por el navegador y la publicación (masiva) se envía al servidor.

Pensé que este no podría ser el caso, así que no habría forma de construir una barra de progreso ajax ya que el servidor no podría hacer nada hasta que haya recibido la publicación completa en ese momento. así solo guarde el archivo en su disco.

Entonces, ¿cómo funciona realmente de un navegador a otro?

+2

Esta es una pregunta válida. +1 – samoz

Respuesta

9

Tu amigo tiene razón. Si quieres una barra de progreso de AJAX, tienes que pasar por algunos aros.

Por lo general, la técnica es publicar la carga dentro de un iframe en un IHttpHandler en el servidor que almacena el progreso en el servidor en un diccionario de todo el servidor codificado por un identificador que el cliente crea e incluye tanto en la solicitud de progreso de AJAX la publicación de carga. De esta forma, cuando el cliente realiza las solicitudes AJAX, el código del servidor que procesa esa solicitud puede leer el valor de ese diccionario para ver cuántos bytes de la solicitud POST del archivo ha procesado el servidor.

Sí, es complicado :)

+0

Creo que esto tiene sentido, pero sugiere que el httphandler funciona a nivel de red y puede detectar paquetes entrantes de una publicación parcial. – Sheff

+1

HttpHandlers no funcionan 'en el nivel de red' persay, pero pueden hacer el trabajo en un nivel inferior que una página estándar. En una página normal, hasta que la POST se haya cargado por completo en el servidor, su código de gestión de eventos no se ejecutará. En un IHttpHandler, puede procesar los datos a medida que llegan, pero pierde todas las cosas automáticas que el ciclo de vida de la página hace por usted. –

7

Creo que su amigo tiene razón, el archivo está codificado en la publicación enviada al servidor. Si realmente desea ver exactamente cómo funciona, intente usar Tamper Data en Firefox para ver los datos reales de la publicación.

ETA:

Los archivos de estilo AJAX que mencionar el trabajo de hacer el cargo en un iframe oculto, a continuación, utilizando peticiones AJAX para comprobar el progreso de la carga en el lado del servidor.

+0

OK, ¿qué está diciendo mi compañero? Estoy bastante seguro de que es correcto, pero seguramente el httphandler tiene que recibir la publicación antes de que pueda hacer algo. Y en este momento tiene la publicación completa de todos modos. o ¿trabaja un httphandler en el nivel de la red e intercepta paquetes? ¿Podría explicarlo más? – Sheff

+1

Algunos servidores pueden comenzar a procesar una solicitud después de que se leen los encabezados pero antes de que se lean los datos. Algunos de los marcos que he usado dan al cuerpo de una solicitud como una secuencia (a menos que los encabezados y los demás sean analizados). La mayoría de los controladores de solicitudes, por supuesto, no envían una respuesta hasta que la solicitud se lee por completo. –

+1

No estoy seguro de que la publicación completa se haya descargado en el punto donde se invoca ProcessRequest() en su httphandler, pero no pude encontrar ninguna documentación real para decir de una forma u otra. –

Cuestiones relacionadas