861 Stimmen

Node.js-Schnell-Dateiserver (statische Dateien über HTTP)

Gibt es ein einsatzbereites Node.js-Tool (installiert mit npm ), die mir helfen würde, Ordnerinhalte als Dateiserver über HTTP zu veröffentlichen.

Beispiel: Wenn ich Folgendes habe

D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg

Dann ab D:\Folder\ node node-file-server.js Ich konnte auf die Datei über

http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

Warum lässt mein Node Static File Server Anfragen fallen? Bezug auf einige mystische

Standard-Node.js-Server für statische Dateien

Wenn es ein solches Tool nicht gibt, welchen Rahmen sollte ich dann verwenden?

Verwandt: Grundlegender statischer Dateiserver in NodeJS

1377voto

Matt Self Punkte 19002

Eine gute Option für ein einsatzbereites Tool könnte http-server sein:

npm install http-server -g

Zur Verwendung:

cd D:\Folder
http-server

Oder etwa so:

http-server D:\Folder

Sehen Sie sich das an: https://github.com/nodeapps/http-server

261voto

Hasan A Yousef Punkte 18939

Wenn Sie das fertige Tool nicht verwenden möchten, können Sie den nachstehenden Code verwenden, wie von mir unter https://developer.mozilla.org/en-US/docs/Node_server_without_framework :

var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
                response.end(); 
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

UPDATE Wenn Sie auf Ihren Server von einer externen Anforderung/Datei aus zugreifen müssen, müssen Sie CORS in Ihrer node.js-Datei überwinden, indem Sie das Folgende schreiben, wie ich in einer früheren Antwort erwähnt habe hier

// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

UPDATE

Wie Adrian in den Kommentaren erwähnt hat, hat er einen ES6-Code mit vollständiger Erklärung geschrieben hier Ich poste seinen Code einfach unten erneut, falls der Code aus irgendeinem Grund von der Originalseite verschwunden ist:

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const port = process.argv[2] || 9000;

http.createServer(function (req, res) {
  console.log(`${req.method} ${req.url}`);

  // parse URL
  const parsedUrl = url.parse(req.url);
  // extract URL path
  let pathname = `.${parsedUrl.pathname}`;
  // based on the URL path, extract the file extension. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extension to MIME typere
  const map = {
    '.ico': 'image/x-icon',
    '.html': 'text/html',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.css': 'text/css',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.svg': 'image/svg+xml',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword'
  };

  fs.exists(pathname, function (exist) {
    if(!exist) {
      // if the file is not found, return 404
      res.statusCode = 404;
      res.end(`File ${pathname} not found!`);
      return;
    }

    // if is a directory search for index file matching the extension
    if (fs.statSync(pathname).isDirectory()) pathname += '/index' + ext;

    // read file from file system
    fs.readFile(pathname, function(err, data){
      if(err){
        res.statusCode = 500;
        res.end(`Error getting the file: ${err}.`);
      } else {
        // if the file is found, set Content-type and send data
        res.setHeader('Content-type', map[ext] || 'text/plain' );
        res.end(data);
      }
    });
  });

}).listen(parseInt(port));

console.log(`Server listening on port ${port}`);

91voto

jakub.g Punkte 33857

Für Leute, die einen Server wollen, der von einem NodeJS-Skript aus ausgeführt werden kann:

Sie können verwenden expressjs/serve-static die ersetzt connect.static (die ab connect 3 nicht mehr verfügbar ist):

myapp.js:

var http = require('http');

var finalhandler = require('finalhandler');
var serveStatic = require('serve-static');

var serve = serveStatic("./");

var server = http.createServer(function(req, res) {
  var done = finalhandler(req, res);
  serve(req, res, done);
});

server.listen(8000);

und dann über die Befehlszeile:

  • $ npm install finalhandler serve-static
  • $ node myapp.js

80voto

Matt Sergeant Punkte 2682

Ich weiß, es ist nicht Node, aber ich habe Pythons SimpleHTTPServer verwendet:

python -m SimpleHTTPServer [port]

Es funktioniert gut und wird mit Python geliefert.

59voto

DHlavaty Punkte 12530

Von npm@5.2.0, npm begonnen, ein neues Binary neben dem üblichen npm zu installieren, das npx . So jetzt, One-Liner, um statische http-Server aus dem aktuellen Verzeichnis zu erstellen:

Verwendung von https://github.com/vercel/serve

npx serve

oder mit https://github.com/http-party/http-server

npx http-server

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X