Express.js - any way to display a file/dir listing?

前端 未结 5 1282
故里飘歌
故里飘歌 2020-12-02 14:33

With Express.js is there a way to display a file/dir listing like apache does when you access the URL of a directory which doesn\'t have a index file - so it displays a list

相关标签:
5条回答
  • 2020-12-02 14:41

    There's a brand new default Connect middleware named directory (source) for directory listings. It has a lot of style and has a client-side search box.

    var express = require('express')
      , app = express.createServer();
    
    app.configure(function() {
      var hourMs = 1000*60*60;
      app.use(express.static(__dirname + '/public', { maxAge: hourMs }));
      app.use(express.directory(__dirname + '/public'));
      app.use(express.errorHandler());
    });
    
    app.listen(8080);
    
    0 讨论(0)
  • 2020-12-02 14:46

    As of Express 4.x, the directory middleware is no longer bundled with express. You'll want to download the npm module serve-index.

    Then, for example, to display the file/dir listings in a directory at the root of the app called videos would look like:

        var serveIndex = require('serve-index');
    
        app.use(express.static(__dirname + "/"))
        app.use('/videos', serveIndex(__dirname + '/videos'));
    
    0 讨论(0)
  • 2020-12-02 14:49

    The following code will serve both directory and files

    var serveIndex = require('serve-index');
    app.use('/p', serveIndex(path.join(__dirname, 'public')));
    app.use('/p', express.static(path.join(__dirname, 'public')));
    
    0 讨论(0)
  • 2020-12-02 14:51

    This will do the work for you: (new version of express requires separate middleware). E.g. you put your files under folder 'files' and you want the url to be '/public'

    var express = require('express');
    var serveIndex = require('serve-index');
    var app = express();
    
    app.use('/public', serveIndex('files')); // shows you the file list
    app.use('/public', express.static('files')); // serve the actual files
    
    0 讨论(0)
  • 2020-12-02 14:59

    Built-in NodeJS module fs gives a lot of fine-grained options

    const fs = require('fs')
    
    router.get('*', (req, res) => {
        const fullPath = process.cwd() + req.path //(not __dirname)
        const dir = fs.opendirSync(fullPath)
        let entity
        let listing = []
        while((entity = dir.readSync()) !== null) {
            if(entity.isFile()) {
                listing.push({ type: 'f', name: entity.name })
            } else if(entity.isDirectory()) {
                listing.push({ type: 'd', name: entity.name })
            }
        }
        dir.closeSync()
        res.send(listing)
    })
    

    Please make sure to read up on path-traversal security vulnerabilities.

    0 讨论(0)
提交回复
热议问题