Encontré tal requisito en mi trabajo, y necesitaba usar NodeJS para cargar archivos. Solía saber solo cómo cargar archivos a través del navegador. Si uso NodeJs, es equivalente a simular el comportamiento del navegador. Después de Google, me di cuenta de que el navegador simplemente usa el protocolo HTTP para transmitir datos al servidor. El protocolo específico es "RFC 1867 - Carga de archivos basado en formularios en HTML". Cargar archivos a través de formularios de formulario en el navegador es a través de este protocolo. Primero podemos ver qué datos envía el navegador al servidor, y luego podemos implementar la función de carga de acuerdo con la copia. Cuando se trata de cargar archivos en formularios de formulario, todos deben estar familiarizados con:
<Form Action = "Http://www.qq.com/" método = "post"> <input type = "text" name = "text1" /> <br /> <input type = "text" name = "text2" /> <br /> <input type = "Subt" /> </form>
Al enviar, puede ver que los siguientes datos se envían al servidor utilizando Fiddler para capturar el paquete:
Publicar http://www.qq.com/ http/1.1
Host: www.qq.com
Contenido-longitud: 23
Tipo de contenido: aplicación/x-www-form-urlencoded; Charset = UTF-8
Text1 = Hello & Text2 = World
Vale la pena señalar que el valor predeterminado de tipo de contenido a la aplicación/x-www-form-urlencoded, por lo que el mensaje estará codificado por URL. Por ejemplo, "Hola" se codificará como%E4%BD%A0%E5%A5%BD.
A continuación, echemos un vistazo a cómo se sube el formulario. Todos deberían estar familiarizados con:
<form de acción = "http://www.qq.com" método = "post" enctype = "multipart/form-data"> <input type = "file" name = "myfile"/> <input type = "envíqu" valor = "enviar"/> </form>
Luego cree un nuevo archivo de texto upload.txt con solo la palabra hello world y cárguelo. Usamos Fiddler para tomar el paquete. Podemos encontrar que enviar datos pasados es un poco más complicado (se han eliminado muchas otras líneas de solicitud no relacionadas, como control de caché y cookies):
Publicar http://www.qq.com/ http/1.1
Host: www.qq.com
Contenido-longitud: 199
Tipo de contenido: multipart/formy-data; límite = --- webkitFormBoundaryWr3x7SXBYQQ4ZF5G
----- WebKitFormBoundaryWR3X7SXBYQQ4ZF5G
Disposición de contenido: formulario de datos; nombre = "myfile"; filename = "upload.txt"
Tipo de contenido: texto/simple
Hola Mundo
----- WebKitFormBoundaryWR3X7SXBYQQ4ZF5G--
Según la definición de RFC 1867, necesitamos generar una pieza de datos límite. Estos datos no pueden aparecer en otra parte del contenido. Esto puede definirse por usted mismo. El algoritmo de generación de cada navegador puede ser diferente. El límite anterior es separar los datos. Después de generar los datos separados, los datos separados se pueden colocar en el tipo de contenido en el cabezal y transmitirse al servidor, es decir, el tipo de contenido anterior: multipart/formy-data; Boundary = --- WebKITFormBoundaryWR3X7SXBYQQ4ZF5G, además, el contenido cargado debe separarse en varios segmentos con datos separados, y cada segmento de datos tiene el nombre del archivo y el nombre al cargar. El servidor usa este nombre para recibir el archivo y el tipo de archivo Tipo de contenido. En este ejemplo, texto/simple. Si la imagen PNG cargada es imagen/png, es imagen/png. Después de una línea en blanco del tipo de archivo, el contenido del archivo cargado también es fácil de entender. En este ejemplo, el archivo de texto cargado es para que el contenido se pueda mostrar directamente. Si el archivo de imagen cargado es un archivo binario, el violinista mostrará código confuso. Después de que termina el contenido del archivo, hay una línea en blanco más datos de límite.
Después de comprender los detalles del formato de envío, el siguiente paso es usar NodeJS para programarlo e implementarlo. En pocas palabras, simplemente envíe los datos al servidor de acuerdo con el formato.
const http = require ('http'); const fs = require ('fs'); // La dirección de publicación es un PHP en el servicio local, utilizado para probar si la carga es Opciones var exitosas = {hostname: 'localhost', puerto: 80, ruta: '/get.php',method:' post '} // Generar datos de datos separados VAR Clave límite límite Boundary Clave límite Boundary '--- WebKitFormBoundaryJLVKBQXTII0YGPAB'; // Lea el contenido del archivo que debe cargarse fs.ReadFile ('./ upload.txt', function (err, data) {// destacan el segmento de datos separado var payload = '-' + boundarykey + '/r/n' + 'contenido-disposition: form-data; name = "myfile"; fileName = "upload.txt"/r/n' + + + + + + 'Content-type: Text/Plain/R/N/R/N'; Payload + = Data; Payload + = '/R/N--' + BoundaryKey + '-'; // Enviar una solicitud var req = http.request (options, function (res) {res.setEncoding ('utf8'); res.on ('data', function (chunk) {console.log (' +' + ' +' + ' +' + ' +' + ' +' chunk);});});req.on('error', function(e) {console.error("error:"+e);});//Write boundary, the size of the data to be sent, and the data itself into the request req.setHeader('Content-Type', 'multipart/form-data; boundary='+boundaryKey+'');req.setHeader('Content-Length', Buffer.bytelength (carga útil, 'utf8')); req.write (carga útil); req.end ();});El enfoque de este artículo es comprender el protocolo e implementarlo con el código. Todavía hay muchas optimizaciones en la organización del código.
Finalmente, en el apache local, simplemente escriba un PHP para guardar el archivo cargado para usar como prueba:
<? Php $ filePath = './upload.txt';move_uploaded_file($_files='myfile'font> •'tmp_name'], $ filePath); echo "ok";>
Además, según RFC 1867, la función de cargar múltiples archivos a la vez se puede realizar. Esto no se describirá en detalle aquí. Si es necesario, consulte RFC 1867 para una implementación detallada.
Lo anterior es la carga de archivo Node.js introducida por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!