NodeJS maneja la carga del archivo
En Express4, Req.files ha sido undefined ; El más utilizado ahora puede ser formidable . Sabes que tiene un evento progress , por lo que estás encantado. La barra de progreso de la versión inferior de IE es una oportunidad; Ok, pruébalo:
form .on ('error', function (err) {console.log (err);}) .on ('aborted', function () {console.log ('aborted');}) .on ('progreso', function (bytesReiveive, bytesexpected) {var var) n = parseInt (parsefloat (bytesReceive/bytesexpected) .tofixed (2)*100);Sí, te alegra ver que la consola imprime una cadena de valores de progreso como se esperaba; Entonces, ve más allá;
form .on('progress',function(bytesReceived, bytesExpected){ var n=parseInt(parseFloat(bytesReceived/bytesExpected).toFixed(2)*100); res.write('<script>window.parent.call('+n+')</script>'); //Upload without refresh, console.log(n); }); El método call es mostrar el valor de progreso en la página; Desafortunadamente, solo puede ver el último 100%, y no puede ver el valor de progreso detallado específico cargado; explorar de nuevo ...
A continuación, cambiemos la idea, pruébela, guarde el valor de progreso a session y agregue una solicitud adicional para encuestar el valor de progreso. ¡Oh, no está mal! Para garantizar que el valor de progreso que solicite sea el valor de progreso que cargue esta vez en lugar del valor de progreso de otras cargas, debe aceptar un valor token en la solicitud cargada y en la solicitud adicional; Ahora otra pregunta es cómo obtener este token al solicitar. Dado que el cuerpo de solicitud de la carga de archivo está en Request Payload , req.body no puede obtener el valor que traiga, y no quiero analizar esta pila, por supuesto que tampoco puedo analizarlo; Es mejor ponerlo en url , el problema es que a veces tienes que actualizar dos veces para actualizar token , ¡lo cual no es bueno! Como último recurso, ¡lo pondré en cookie !
var cookies = function () {var cks = req.headers.cookie.split (';'), obj = {}; para (var i = 0; i <cks.length; i ++) {obj [cks [i] .split ('=' ') [0] .replace (// s+/ig,' ')] = unescape (cks [i] .split (' = ') [1]); } return obj; } (); var QueryToken = Cookies .__ Token__; form .on ('progreso', function (bytesReceive, bytesExpected) {var n = parseInt (parsefloat (form.bytesReceive/form.bytesExpected) .tofixed (2)*100); if (req.session ['file'+querykoken]) {req.session ['file'+queryToken]. req.session ['File'+QueryToken] = {token: QueryToken, porcentaje: n}};Para IE789, llegué a la encuesta por el valor de progreso. Me perdono, pero me duele el corazón;
var getData = function () {$ .post ('/uploader', {getFileInfo: 1, uploadToken: utils.cookie.getcookie ('__ token__')}) .Then (function (data) {console.log (data); if (data.mes <0) {getData ();} más {var Llame (Pros.Percent); } getData (); El método call es mostrar el valor de progreso en la página; Desafortunadamente, solo puede ver el último 100%, y no puede ver el valor de progreso detallado específico cargado; explorar de nuevo ...
Bien, volví a caer en eso; Pero todavía siento que algo está mal, no hay problema con las encuestas de Ajax. El problema es que session tiene que esperar hasta que la carga se complete antes de que tenga un valor, por lo que solo puedo ver el 100%, y no puedo ver el valor de progreso detallado; ¿Puedo pensar que en progreso, el res.write anterior y esta req.session se suspendieron, pero ahorra los resultados de cada ejecución hasta que se lance progress , por lo que solo puedo ver el 100%; No estoy de humor para leer el código fuente de formidable , por supuesto que no puedo entenderlo, ¡así que creo que primero!
Dado que ajax Polling está bien, no es fácil guardarlo en session . Si realmente no funciona, pruébelo en global . No podrá meter un valor en el objeto global y lo colgará. Si hace un ligero cambio, se pondrá en global :
form .on ('progreso', function (bytesReceive, bytesExpected) {var n = parseInt (parsefloat (form.bytesReceive/form.bytesexpected) .tofixed (2)*100); if (global [file '+quyToKen]) {global [' file '+queryToken] .percent = n;} Global ['Archivo'+QueryToken] = {Token: QueryToken, porcentaje: n}};Continuar encuestando.
¡Hermoso, eso es todo! Lo que veo en Chrome es lo mismo que el progreso de HTML5, pero se sentirá un poco atascado en IE789, pero aún puede ver el valor de progreso detallado; Después de todo, los viejos navegadores no son buenos, ya sabes; Y, cada vez que sube, pone el valor en global , por lo que debe limpiarlo adecuadamente. Después de cargar el archivo, puede transferirlo al directorio especificado global['file'+queryToken]=null ;
Sin embargo, la encuesta significa muchas solicitudes una tras otra, y puede haber problemas aquí; Si no lo limita, el valor de progreso se solicita una vez cada intervalo de 500 ms; Bueno, la barra de progreso IE789 se resuelve así, y se acuerda tirar flash; Aunque esta encuesta es compatible con todos los navegadores, sigue siendo un desperdicio de tantas solicitudes. ¡Hagamos un juicio, continúe HTML5 fuera de IE789!
En realidad, si lo mide, ¿cuál es más digno, además de una carga flash o una solicitud adicional? Perdóname por no entender Flash, no diré mucho. De todos modos, no me gusta agregar archivos adicionales a la página;
Resumir
Todavía hay muchos detalles sobre los componentes de carga de archivos. Originalmente quería hacer un archivo JS, pero luego pensé que para ser más reutilizable, sería mejor hacerlo como una página independiente. Si necesita cargarlo, solo iframe, que definitivamente es mucho mejor que hacer un archivo JS. Lo anterior es todo el contenido de este artículo. Espero que pueda ayudarlo en su estudio o trabajo. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.