zoukankan      html  css  js  c++  java
  • node搭建文件服务器

    python可以在目录下python -m http.server 8080来启动一个静态文件服务器,使用node实现一个

    运行node fileServer.js D:lanFeature 即可将指定的目录 D:lanFeature Web程序变成一个文件服务器目录

    fileServer.js:

    "use strict";
    
    var http = require('http');
    
    var processRequest = require('./server');
    
    
    
    var httpServer = http.createServer((req, res) => {
        processRequest(req, res);
    });
    
    var port = 8083;
    
    httpServer.listen(port, function() {
    
        console.log(`app is running at port:${port}`);
    });

    mime.js:

    module.exports = {
        "css": "text/css",
        "gif": "image/gif",
        "html": "text/html",
        "ico": "image/x-icon",
        "jpeg": "image/jpeg",
        "jpg": "image/jpeg",
        "js": "text/javascript",
        "json": "application/json",
        "pdf": "application/pdf",
        "png": "image/png",
        "svg": "image/svg+xml",
        "swf": "application/x-shockwave-flash",
        "tiff": "image/tiff",
        "txt": "text/plain",
        "wav": "audio/x-wav",
        "wma": "audio/x-ms-wma",
        "wmv": "video/x-ms-wmv",
        "xml": "text/xml"
    };

    server.js

    var url = require('url');
    
    var fs = require('fs');
    
    var path = require('path');
    
    var mime = require('./mime');
    
    function processRequest(request, response) {
    
    
        //request里面切出标识符字符串
        var requestUrl = request.url;
        //url模块的parse方法 接受一个字符串,返回一个url对象,切出来路径
        var pathName = url.parse(requestUrl).pathname;
    
        //对路径解码,防止中文乱码
        var pathName = decodeURI(pathName);
    
        //解决301重定向问题,如果pathname没以/结尾,并且没有扩展名
        if (!pathName.endsWith('/') && path.extname(pathName) === '') {
    
            pathName += '/';
            var redirect = "http://" + request.headers.host + pathName;
            response.writeHead(301, {
                location: redirect
            });
            //response.end方法用来回应完成后关闭本次对话,也可以写入HTTP回应的具体内容。
            response.end();
        };
    
        //获取资源文件的绝对路径
        var filePath = path.resolve(__dirname + pathName);
        console.log(filePath);
        //获取对应文件的文档类型
        //我们通过path.extname来获取文件的后缀名。由于extname返回值包含”.”,所以通过slice方法来剔除掉”.”,
        //对于没有后缀名的文件,我们一律认为是unknown。
        var ext = path.extname(pathName);
        ext = ext ? ext.slice(1) : 'unknown';
    
        //未知的类型一律用"text/plain"类型
        var contentType = mime[ext] || "text/plain";
    
        fs.stat(filePath, (err, stats) => {
    
            if (err) {
                response.writeHead(404, { "content-type": "text/html" });
                response.end("<h1>404 Not Found</h1>");
            };
            //没出错 并且文件存在
            if (!err && stats.isFile()) {
    
                response.writeHead(200, { "content-type": contentType });
                //建立流对象,读文件
                var stream = fs.createReadStream(filePath);
                //错误处理
                stream.on('error', function() {
    
                    response.writeHead(500, { "content-type": contentType });
    
                    response.end("<h1>500 Server Error</h1>");
    
                });
                //读取文件
                stream.pipe(response);
    
            };
            //如果路径是目录
            if (!err && stats.isDirectory()) {
    
                var html = " <head><meta charset = 'utf-8'/></head>";
                //读取该路径下文件
                fs.readdir(filePath, (err, files) => {
                    if (err) {
                        console.log("读取路径失败!");
                    } else {
    
                        // files.foreach(function (file) {
                        // //做成一个链接表,方便用户访问
                        // html+=`<div><a href="${file}">${file}</a></div>`;
                        //  });
    
                        for (var file of files) {
                            if (file === "index.html") {
    
                                response.writeHead(200, { "content-type": "text/html" });
                                response.end(file);
    
                                break;
                            };
                            html += `<div><a href='${file}'>${file}</a></div>`;
                            console.log(html);
    
                        }
                        response.writeHead(200, { "content-type": "text/html" });
                        response.end(html);
                    };
    
                });
    
    
            };
    
        });
    
    };
    
    module.exports = processRequest;
  • 相关阅读:
    利用python登录网页并自动签到
    链表的学习--创建、添加和删除元素
    Nginx指定IP无须通过认证
    curl命令获取站点的各类响应时间
    django中的Q和F方法
    python subprocess重定向标准输出
    python创建虚拟环境
    flask-sqlalchemy的使用
    sqlachelmy的使用
    wtforms的使用
  • 原文地址:https://www.cnblogs.com/rlann/p/8012234.html
Copyright © 2011-2022 走看看