关于node实现文件上传

关于node实现文件上传

使用Multer

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上非常高效。

注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。

  npm install --save multer
复制代码

使用方法

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })

var app = express()
// 单文件上传
app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // Do something
})

// 多文件上传
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
  // Do something
})

var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
  // req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组
  // Do something
})
复制代码
DiskStorage
  import multer from 'multer';

  var storage = multer.diskStorage({
    //设置上传文件路径,以后可以扩展成上传至七牛,文件服务器等等
    //Note:如果你传递的是一个函数,你负责创建文件夹,如果你传递的是一个字符串,multer会自动创建
    destination: config.uploadPath, //  process.cwd() + '/public/uploads'
    //TODO:文件区分目录存放
    filename: function (req, file, cb) {
      var fileFormat = (file.originalname).split(".");
      cb(null, fileFormat[0] + "." + fileFormat[fileFormat.length - 1]);
    }
  });

  //添加配置文件到muler对象。
  var upload = multer({
    storage: storage,
    //其他设置请参考multer的limits
    //limits:{}
  });
复制代码

有两个选项可用,destinationfilename。他们都是用来确定文件存储位置的函数。

destination 是用来确定上传的文件应该存储在哪个文件夹中。也可以提供一个 string (例如 '/tmp/uploads')。如果没有设置 destination,则使用操作默认的临时文件夹

注意: 如果你提供的 destination 是一个函数,你需要负责创建文件夹。当提供一个字符串,multer 将确保这个文件夹是你创建的。

filename 用于确定文件夹中的文件名的确定。 如果没有设置 filename,每个文件将设置为一个随机文件名,并且是没有扩展名的

注意: Multer 不会为你添加任何扩展名,你的程序应该返回一个完整的文件名。

每个函数都传递了两个请求 (req) 和一些关于这个文件的信息 (file) 有助于你的决定。

limits

一个对象,指定一些数据大小的限制。Multer 通过这个对象使用 busboy,详细的特性可以在 busboy's page 找到。

可以使用下面这些:

KeyDescriptionDefault
fieldNameSizefield 名字最大长度100 bytes
fieldSizefield 值的最大长度1MB
fields非文件 field 的最大数量无限
fileSize在 multipart 表单中,文件最大长度 (字节单位)无限
files在 multipart 表单中,文件最大数量无限
parts在 multipart 表单中,part 传输的最大数量(fields + files)无限
headerPairs在 multipart 表单中,键值对最大组数2000

设置 limits 可以帮助保护你的站点免受拒绝服务 (DoS) 攻击。

fileFilter

设置一个函数来控制什么文件可以上传以及什么文件应该跳过,这个函数应该看起来像这样:

function fileFilter (req, file, cb) {
  // 可以在这个方法里面进行文件类型判断,然后决定是否接受这个文件
  // 这个函数应该调用 `cb` 用boolean值来
  // 指示是否应接受该文件

  // 拒绝这个文件,使用`false`,像这样:
  cb(null, false)

  // 接受这个文件,使用`true`,像这样:
  cb(null, true)

  // 如果有问题,你可以总是这样发送一个错误:
  cb(new Error('I don\'t have a clue!'))

}
复制代码

尾声

俗话说:说的在好也不如亲自动手实践一下,之前感觉没什么困难,但是实际操作去写的时候还是发现不少问题存在。 还是需要努力!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值