上传文件

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2019-11-24

安装:npm install multer

const express = require('express');
const multer = require('multer');
const fs = require('fs');
const pathLib = require('path');

var server = express();

// bodyParser只能用来解析post数据 application/x-www-form-urlencoded 
// multer解析post文件 multipart/form-data
// 需要一个multer函数返回的对象
// dest选项 指定接收的文件放在哪个目录
var objMulter = multer({dest: './upload'});

// 只接受名字是f1的文件
// server.use(objMulter.single('f1')) 
// <input type="file" name="f1"/>
// any 可以接受任意文件
server.use(objMulter.any()) 

server.post('/', function (req, res) {
  console.log(req.body); // post数据
  console.log(req.files); // post文件
  // pathLib.parse(file_path)之后 返回一个对象 有4个主要属性
  // base : 文件全名
  // ext:扩展名
  // dir: 文件路径
  // name: 文件名 不包括扩展名
  var oldName = req.files[0].path;
  var newName = req.files[0].path + pathLib.parse(req.files[0].originalname).ext

  // 2.重命名 
  // 接受上传的目录中保存的是名字为29eeb193fb5dbd49711617a4303e04b5的二进制文件 而不是一张图片
  // 需要使用fs来重命名 加上文件后缀 fs.rename()
  // 三个参数 原文件路径 新文件路径 回调函数
  fs.rename(oldName, newName, function (err, data) {
    if (err) {
      res.send('上传失败')
    } else {
      res.send('成功')
    }
  })
})

server.listen(8081);

// req.files 未指定dest之前 接收到的二进制数据 
// [ { fieldname: 'f1',
//     originalname: '5a94b3a06f1e7.jpg',
//     encoding: '7bit',
//     mimetype: 'image/jpeg',
//     buffer:
//      <Buffer ff d8 ff e1 29 55 45 78 69 66 00 00 49 49 2a 00 08 00 00 00 10  ... >,
//   size: 1703495 } ]

// req.files 指定dest 接收文件夹之后,接收到的是上传之后的文件名
// [ { fieldname: 'f1',
//     originalname: '5a94b3a06f1e7.jpg',
//     encoding: '7bit',
//     mimetype: 'image/jpeg',
//     destination: './upload',
//     filename: '29eeb193fb5dbd49711617a4303e04b5',
//     path: 'upload/29eeb193fb5dbd49711617a4303e04b5',
//     size: 1703495 } ]