J'ai un logo qui réside au public/images/logo.gif. Voici mon code nodejs.
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain' });
res.end('Hello World \n');
}).listen(8080, '127.0.0.1');
Cela fonctionne mais quand je demande localhost: 8080/logo.gif, alors évidemment je n’ai pas le logo.
Quels changements je dois faire pour servir une image.
Je suis d’accord avec les autres affiches qui, à terme, devraient utiliser un cadre tel que Express. les étapes sont
Le code ressemblerait à quelque chose comme ça (non testé)
fs = require('fs');
http = require('http');
url = require('url');
http.createServer(function(req, res){
var request = url.parse(req.url, true);
var action = request.pathname;
if (action == '/logo.gif') {
var img = fs.readFileSync('./logo.gif');
res.writeHead(200, {'Content-Type': 'image/gif' });
res.end(img, 'binary');
} else {
res.writeHead(200, {'Content-Type': 'text/plain' });
res.end('Hello World \n');
}
}).listen(8080, '127.0.0.1');
Vous devriez utiliser le express framework.
npm install express
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/public'));
app.listen(8080);
puis l'URL localhost: 8080/images/logo.gif devrait fonctionner
J'aime utiliser les services Restify for REST. Dans mon cas, j’avais créé un service REST pour servir des images, puis si une source d’images renvoyait 404/403, je voulais renvoyer une autre image. Voici ce que j'ai trouvé en combinant certaines des choses ici:
function processRequest(req, res, next, url) {
var httpOptions = {
hostname: Host,
path: url,
port: port,
method: 'GET'
};
var reqGet = http.request(httpOptions, function (response) {
var statusCode = response.statusCode;
// Many images come back as 404/403 so check explicitly
if (statusCode === 404 || statusCode === 403) {
// Send default image if error
var file = 'img/user.png';
fs.stat(file, function (err, stat) {
var img = fs.readFileSync(file);
res.contentType = 'image/png';
res.contentLength = stat.size;
res.end(img, 'binary');
});
} else {
var idx = 0;
var len = parseInt(response.header("Content-Length"));
var body = new Buffer(len);
response.setEncoding('binary');
response.on('data', function (chunk) {
body.write(chunk, idx, "binary");
idx += chunk.length;
});
response.on('end', function () {
res.contentType = 'image/jpg';
res.send(body);
});
}
});
reqGet.on('error', function (e) {
// Send default image if error
var file = 'img/user.png';
fs.stat(file, function (err, stat) {
var img = fs.readFileSync(file);
res.contentType = 'image/png';
res.contentLength = stat.size;
res.end(img, 'binary');
});
});
reqGet.end();
return next();
}
Version du noeud vanille comme demandé:
var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
http.createServer(function(req, res) {
// parse url
var request = url.parse(req.url, true);
var action = request.pathname;
// disallow non get requests
if (req.method !== 'GET') {
res.writeHead(405, {'Content-Type': 'text/plain' });
res.end('405 Method Not Allowed');
return;
}
// routes
if (action === '/') {
res.writeHead(200, {'Content-Type': 'text/plain' });
res.end('Hello World \n');
return;
}
// static (note not safe, use a module for anything serious)
var filePath = path.join(__dirname, action).split('%20').join(' ');
fs.exists(filePath, function (exists) {
if (!exists) {
// 404 missing files
res.writeHead(404, {'Content-Type': 'text/plain' });
res.end('404 Not Found');
return;
}
// set the content type
var ext = path.extname(action);
var contentType = 'text/plain';
if (ext === '.gif') {
contentType = 'image/gif'
}
res.writeHead(200, {'Content-Type': contentType });
// stream the file
fs.createReadStream(filePath, 'utf-8').pipe(res);
});
}).listen(8080, '127.0.0.1');
Il est trop tard mais aide quelqu'un, j'utilise node version v7.9.0
et express version 4.15.0
si votre structure de répertoire ressemble à ceci:
your-project
uploads
package.json
server.js
code server.js:
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/uploads'));// you can access image
//using this url: http://localhost:7000/abc.jpg
//make sure `abc.jpg` is present in `uploads` dir.
//Or you can change the directory for hiding real directory name:
`app.use('/images', express.static(__dirname+'/uploads/'));// you can access image using this url: http://localhost:7000/images/abc.jpg
app.listen(7000);
Vous devez utiliser une bibliothèque prenant en compte les URL et les fichiers statiques. Je recommande d'utiliser Express . Il dispose d'installations pour configurer des itinéraires et d'un module de service de fichier statique.
var http = require('http');
var fs = require('fs');
http.createServer(function(req, res) {
res.writeHead(200,{'content-type':'image/jpg'});
fs.createReadStream('./image/demo.jpg').pipe(res);
}).listen(3000);
console.log('server running at 3000');
Cela peut paraître un peu hors sujet, puisque vous vous interrogez sur le service de fichiers statiques via Node.js spécifiquement (où fs.createReadStream('./image/demo.jpg').pipe(res)
est en fait une bonne idée), mais en production, vous souhaiterez peut-être que votre application Node gère des tâches qui ne peuvent pas être traitées sinon, décharger statique servant par exemple à Nginx. Cela signifie moins de codage dans votre application et une meilleure efficacité, car les proxys inverses sont, par nature, idéaux pour cela.
Cette méthode fonctionne pour moi, elle n'est pas dynamique mais va droit au but:
const fs = require('fs');
const express = require('express');
const app = express();
app.get( '/logo.gif', function( req, res ) {
fs.readFile( 'logo.gif', function( err, data ) {
if ( err ) {
console.log( err );
return;
}
res.write( data );
return res.end();
});
});
app.listen( 80 );