Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

158
Views
Servidor http Node.js + imagen

Entonces, estoy creando un sitio web con Node.js y estoy usando un servidor http. Estoy tratando de servir una imagen con él. La imagen definitivamente se muestra, pero solo la parte superior. Aquí está la imagen, lo que sucede y el código del servidor (en ese orden). ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

 const server = http.createServer((req, res) => { // get the file path from req.url, or '/public/index.html' if req.url is '/' const filePath = ( req.url === '/' ) ? '/public/index.html' : req.url; // determine the contentType by the file extension const extname = path.extname(filePath); let contentType = 'text/html'; if (extname === '.js') contentType = 'text/javascript'; else if (extname === '.css') contentType = 'text/css'; else if(extname === (".png")) { var imagePath = path.join(__dirname, '/', req.url); var fileStream = fs.createReadStream(imagePath); res.writeHead(200, {"Content-Type": "image/png"}); fileStream.pipe(res); } // pipe the proper file to the res object res.writeHead(200, { 'Content-Type': contentType }); fs.createReadStream(`${__dirname}/${filePath}`, 'utf8').pipe(res); });

Además, estoy usando websocket, si eso ayuda.

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Si su imagen es un PNG, entonces intenta llamar a res.writeHead(...) dos veces e intenta .pipe(res) dos veces. Eso definitivamente causará un problema.

Parece que no necesita una ruta separada de código completo a .pipe() para archivos png y podría hacer esto:

 const server = http.createServer((req, res) => { // get the file path from req.url, or '/public/index.html' if req.url is '/' const filePath = (req.url === '/') ? '/public/index.html' : req.url; // determine the contentType by the file extension const extname = path.extname(filePath); let contentType = 'text/html'; if (extname === '.js') { contentType = 'text/javascript'; } else if (extname === '.css') { contentType = 'text/css'; } else if (extname === '.png') { contentType = 'image/png'; } // pipe the proper file to the res object res.writeHead(200, { 'Content-Type': contentType }); fs.createReadStream(`${__dirname}/public/${filePath}`).pipe(res); });

Además, tenga en cuenta que su código tiene una vulnerabilidad de seguridad mala (que he parcheado en mi ejemplo de código anterior). Su código le permite a un atacante leer cualquier archivo en su directorio __dirname (incluidos todos los archivos de su servidor) simplemente agregando ese archivo a la URL. Nunca debes permitir esto. Los archivos de servicio público que se buscan haciendo coincidir la URL con el nombre de archivo como este solo deben servirse desde un directorio que esté dedicado ÚNICAMENTE a archivos disponibles públicamente. Por lo general, uno crearía un directorio public y serviría archivos solo desde esa jerarquía de directorios. Tenga en cuenta que cambié el código de esto:

 ${__dirname}/${filePath}

a esto:

 ${__dirname}/public/${filePath}

Y, deberá mover los archivos disponibles públicamente que pretende hacer coincidir con este código en ese subdirectorio y asegurarse de que el subdirectorio contenga SÓLO archivos disponibles gratuitamente para el público.


También tenga en cuenta que el marco Express muy simple para crear un servidor web en nodejs tiene express.static() que ya hace todo esto por usted. Simplemente cree un directorio de archivos disponibles públicamente (de cualquier tipo de archivo común), coloque una línea de middleware en su configuración Express que apunte a ese directorio de archivos y automáticamente servirá cualquiera de esos archivos cuando lo solicite una URL que coincida con el hoja parte del nombre del archivo. Maneja automáticamente la configuración del tipo de contenido, busca automáticamente index.html para las solicitudes / , elimina automáticamente las solicitudes .. de la URL, etc., y se examina minuciosamente en busca de problemas de seguridad.

Aparte de las razones de aprendizaje/académicas, la mayoría de las personas no crean un servicio web desde cero en nodejs, sino que comienzan con uno de los marcos de trabajo más útiles y simples, como Express o nextjs, porque tienen un código precompilado y probado previamente para muchas de las cosas simples que desea hacer en un servidor web.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!