简单的文件服务器

有时候,我们想读取一些服务器上的文件,但是又不想写太复杂的程序,可以考虑用nodejs,可以很简单的写出一个文件服务器

下面是我写的一个简单的文件服务器,附带缓存功能,这是github链接,或者直接复制下面的代码运行即可,需要安装mime的依赖

const port = 3004; // 端口号

const http = require('http');

const url = require('url');

const fs = require('fs');

const path = require('path');

const mime = require('mime');

const STATIC_FOLDER = 'public'; // 默认读取public文件夹下的文件

const IS_OPEN_CACHE = true; // 是否开启缓存功能

const CACHE_TIME = 10;// 告诉浏览器多少时间内可以不用请求服务器,单位:秒

const server = http.createServer((req, res) => {

const obj = url.parse(req.url); // 解析请求的url

let pathname = obj.pathname; // 请求的路径

if (pathname === '/') {

pathname = './index.html';

}

const realPath = path.join(__dirname, STATIC_FOLDER, pathname); // 获取物理路径

// 获取文件基本信息,包括大小,创建时间修改时间等信息

fs.stat(realPath, (err, stats) => {

let endFilePath = '', contentType = '';

if (err || stats.isDirectory()) {

// 报错了或者请求的路径是文件夹,则返回404

res.writeHead(404, 'not found', {

'Content-Type': 'text/plain'

});

res.write(`the request ${pathname} is not found`);

res.end();

} else {

let ext = path.extname(realPath).slice(1); // 获取文件拓展名

contentType = mime.getType(ext) || 'text/plain';

endFilePath = realPath;

if (!IS_OPEN_CACHE) {

// 未开启缓存

let raw = fs.createReadStream(endFilePath);

res.writeHead(200, 'ok');

raw.pipe(res);

} else {

// 获取文件最后修改时间,并把时间转换成世界时间字符串

let lastModified = stats.mtime.toUTCString();

const ifModifiedSince = 'if-modified-since';

// 告诉浏览器在规定的什么时间内可以不用请求服务器,直接使用浏览器缓存,不过貌似没有生效,需要再学习一下为什么

let expires = new Date();

expires.setTime(expires.getTime() + CACHE_TIME * 1000);

res.setHeader("Expires", expires.toUTCString());

res.setHeader('Cache-Control', 'max-age=' + CACHE_TIME);

if (req.headers[ifModifiedSince] && lastModified === req.headers[ifModifiedSince]) {

// 请求头里包含请求ifModifiedSince且文件没有修改,则返回304

res.writeHead(304, 'Not Modified');

res.end();

} else {

// 返回头Last-Modified为当前请求文件的最后修改时间

res.setHeader('Last-Modified', lastModified);

// 返回文件

let raw = fs.createReadStream(endFilePath);

res.writeHead(200, 'ok');

raw.pipe(res);

}

}

}

});

});

server.listen(port);

console.log(`server is running at http://localhost:${port}`)

不过目前还有一点问题,服务器缓存返回304,还有修改文件后,再次请求会返回最新文件这个功能目前没有问题,不过设置的Cache-Control和Expires后,在规定的时间内还是会请求服务器,这个还需要再看一下怎么回事,要是有人了解的话可以告诉我一下,谢谢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

node文件服务器,nodejs一个简单的文件服务器的创建方法相关推荐

  1. 如何用 Node.js 实现一个简单的 Websocket 服务?

    最近正在研究 Websocket 相关的知识,想着如何能自己实现 Websocket 协议.到网上搜罗了一番资料后用 Node.js 实现该协议,倒也没有想象中那么复杂,除去注释语句和 console ...

  2. Node.js搭建一个简单的服务器

    文章目录 Node.js的安装 了解Node.js模块系统 服务器的搭建 一.创建一个Web服务器 注意 程序代码 运行 二.静态资源托管 静态资源 注意 程序代码 运行 三.简单接口的实现(简单服务 ...

  3. 使用Node.js写一个简单的api接口

    引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...

  4. dwcc2015如何制作html,Dreamweaver CC2015简单表单的创建方法

    Dreamweaver CC 2015 官方正式版 软件大小:249M授权方式:免费软件 立即下载 Dreamweaver CC2015怎么创建简单的表单?Dreamweaver集网页制作和管理网站于 ...

  5. 用C语言编写的一个简单的文件服务器

    前言 本文章将介绍如何用C语言在Linux环境下搭建一个C/S模型的文件服务器,功能类似于百度云,可以上传,下载,查看云端的文件,现在暂且给他取个名字叫"浩云"吧. 一.功能使用说 ...

  6. 如何用express+node+ejs 搭建一个简单的页面

    1.建立工程文件夹my_ejs. 2.首先利用npm install express和npm install ejs 下载这两个家伙.至于要不要设置成全局的,看习惯,我习惯性的下载到本项目中的文件夹中 ...

  7. 无配置WCF客户端的一个简单到令人发指的实现方法

    因为项目比较大,接口一大堆,同时也是为了模块间完全解耦(只依赖Common),只能是采用多个WCF服务类库的方案.这样带来的问题就是上帝都不知道在配置文件中到底需要配置多少个Endpoint!理论上是 ...

  8. java写一个简单的浪漫代码_求一个简单但是浪漫的表白方法!!

    鲜花表白 只要和爱情沾边儿那都离不开玫瑰花,所以最简单的方式就是用玫瑰花表白,玫瑰花表白可以体现在数量上,有送一朵的,有送十一朵的,又送三十三朵,还有送九十九朵的.除此之外,还可以摆鲜花阵表白,一般情 ...

  9. 导入Flex/Flash项目后的一个简单错误:无法创建 HTML 包装器

    2019独角兽企业重金招聘Python工程师标准>>> 导入Flex/Flash项目之后包资源管理器中的文件夹出现了红叉,问题提示如图: 这可能是世界上最好解决的问题了,没有之一!! ...

  10. SpringCloud工作笔记049---nginx的安装及配置为简单的文件服务器

    这个可以在项目中做个简单的文件服务器用,如果是权限这块的,可以把权限设计在系统中,有权限的才能访问 某个文件,然后把nginx文件服务器,放到内网上,外网不可访问 ------------------ ...

最新文章

  1. 解决javascript动态改变img的src属性图片不显示问题
  2. linux同步硬件和系统时钟,liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?...
  3. ASP.NET Core Authentication and Authorization
  4. java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...
  5. 源表字段修改以后引发GoldenGate同步失败
  6. “熊猫血”产妇诞双胞胎困难 丈夫全城寻找血源
  7. jQuery 版本viewer.js插件的结构分析与学习
  8. 【linux基础】16、软件包管理
  9. [数据结构] 图 ,邻接矩阵法,邻接表法
  10. 学术之路如何走好?过来人的10条建议!
  11. FIND、FINDINDEX、INDEXOF、LASTINDEX、INCLUDES 数组五种查询条件方法介绍
  12. 如何配置Sql Server 2005之ODBC数据源连接
  13. 2021年企业选型OA系统十大品牌
  14. 常用的6个跨品种套利组合
  15. 携程四君子:中国最美创业故事
  16. 守卫工厂智能 当SDN遇上智能制造
  17. 缺陷检测End-to-end training of a two-stage neural networkfor defect detection(端到端的两步神经网络的缺陷检测)
  18. php删除网站多余空白页,删除多余空白页的三种方法
  19. m41+m42+m43+m44
  20. PHP7有哪些新特性

热门文章

  1. 计算机操作系统应用,.计算机操作系统应用技巧 (转
  2. java中同步关键字_Java中的同步关键字
  3. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
  4. 软件设计原则(二) 接口隔离原则
  5. Java枚举enum使用及相关的操作
  6. Java中实现十进制数转换为二进制的三种方法
  7. 微信公众平台开发视频教程
  8. iOS----UIScrollView
  9. MySQL复制篇之---半同步复制
  10. 03_部署并访问项目,处理404,500(servlet+java bean+jsp的商城教程)