express 文件服务器,express+formidable 搭建文件服务器

文件下载

文件下载,可以利用 Express 内置的 express.static 托管静态文件,例如图片、CSS、JavaScript 文件等1

app.use(express.static('public'));

这样就可以访问 public 目录下的资源了1

http://localhost:3000/images/bg.png

如果资源文件放在多个目录,则可以多次调用 express.static 中间件1

2

app.use(express.static('public'));

app.use(express.static('files'));

访问静态资源文件时,express.static 中间件会根据目录添加的顺序查找所需的文件。

如果你希望所有通过 express.static 访问的文件都存放在一个 “虚拟(virtual)” 目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现, 如下所示1

app.use('/static', express.static('public'));

现在,可以通过带有 “/static” 前缀的地址来访问 public 目录下面的文件了。

1

http://localhost:3000/static/images/bg.png

文件上传

文件上传主要是使用了第三方库formidable, 主要是用来解析表单数据.

安装1

$ npm install --save formidable

参数说明

form.encoding = ‘utf-8’ 设置表单域的编码

form.uploadDir = “/my/dir”; 设置上传文件存放的文件夹,默认为系统的临时文件夹,可以使用 fs.rename() 来改变上传文件的存放位置和文件名

form.keepExtensions = false; 设置该属性为 true 可以使得上传的文件保持原来的文件的扩展名。

form.type 只读,根据请求的类型,取值’multipart’ or ‘urlencoded’

form.maxFieldsSize = 2 1024 1024; 限制所有存储表单字段域的大小(除去 file 字段),如果超出,则会触发 error 事件,默认为 2M

form.maxFields = 1000 设置可以转换多少查询字符串,默认为 1000

form.hash = false; 设置上传文件的检验码,可以有两个取值’sha1’ or ‘md5’.

form.multiples = false; 开启该功能,当调用 form.parse() 方法时,回调函数的 files 参数将会是一个 file 数组,数组每一个成员是一个 File 对象,此功能需要 html5 中 multiple 特性支持

form.bytesReceived 返回服务器已经接收到当前表单数据多少字节

form.bytesExpected 返回将要接收到当前表单所有数据的大小

formidable.File对象

file.size = 0 上传文件的大小,如果文件正在上传,表示已上传部分的大小

file.path = null 上传文件的路径。如果不想让 formidable 产生一个临时文件夹,可以在 fileBegain 事件中修改路径

file.name = null 上传文件的名字

file.type = null 上传文件的 mime 类型

file.lastModifiedDate = null 时间对象,上传文件最近一次被修改的时间

file.hash = null 返回文件的 hash 值

可以使用 JSON.stringify(file.toJSON()) 来格式化输出文件的信息

结合 expresss 路由使用1

2

3

4

5

6

7

8

9

router.post('/upload', function (req, res) {

const form = new formidable.IncomingForm();

form.uploadDir = config.imageDir;//上传文件的保存路径

form.keepExtensions = true;//保存扩展名

form.maxFieldsSize = config.maxImageSize;//上传文件的最大大小

form.parse(req, (err, fields, files) => {

//...

})

})

修改文件名

如果想修改文件名,可以在 form.parse 回调中修改1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

form.parse(req, (err, fields, files) => {

if (err) {

res.status(err.status || 500);

return

}

console.log(files.file.path);

console.log('文件名:' + files.file.name);

var t = (new Date()).getTime();

//生成随机数

var ran = parseInt(Math.random() * 8999 + 10000);

//拿到扩展名

var extname = path.extname(files.file.name);

//path.normalize('./path//upload/data/../file/./123.jpg'); 规范格式文件名

var oldpath = path.normalize(files.file.path);

//新的路径

let newfilename = t + ran + extname;

var newpath = './public/images/' + newfilename;

console.warn('oldpath:' + oldpath + ' newpath:' + newpath);

fs.rename(oldpath, newpath, function (err) {

if (err) {

console.error("改名失败" + err);

res.status(500);

}

res.status(200);

});

})

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值