NODEJS文件上传

摘要:
上传文件,查了写资料。使用req.filesExpress默认的上传路径为/tmp。支持文件上传中间件因为时间有限,并没有做很深入的了解,看了下busboy的使用方法,感觉略麻烦。多图上传nodeJsvarfs=require;varexpress=require;varmulter=requirevarapp=express();varupload=multer;//多图上传app.post;app.get;app.listen;html:多图上传˂inputty
基于NodeJs的文件上传
0.7612018.04.02 22:38:00字数 785阅读 19,969

最近,自己玩nodeJs,用上了Express框架,小白。上传文件,查了写资料。
发现了有req.files这个接口,然后试了下。

使用req.files

Express默认的上传路径为/tmp。如果是windows系统,会有报错。所以,你可以指定上传的临时目录:

//默认临时目录
//app.use(express.bodyParser());
//修改自定义目录,V2.5.4版本之后支持
app.use(express.bodyParser({uploadDir:'./uploads'}));

使用方法:
前端:

<form action="/uploadImg" method="post" enctype="multipart/form-data">
    <h2>单图上传</h2>
    <input type="file" name="logo">
    <input type="submit" value="提交">
</form>

nodeJs

app.post('/uploadImg', function(req, res, next) {
  console.log(req.body);
  console.log(req.files);
  //获取详细信息
  var file = req.files.logo;//From the name
  console.log('文件类型:%s', file.type);
  console.log('原始文件名:%s', file.name);
  console.log('文件大小:%s', file.size);
  console.log('文件保存路径:%s', file.path);
});

其中,通过定义的对象名来获取具体的file对象。常用属性:

  • size ---- 文件大小(bytes)
  • path ---- 文件上传后的路径
  • name ---- 文件的原始文件名称.
  • type ----文件类型

同时,通过express上传的目录都是临时目录,如果要进行永久性保存,还需要将其移动到项目的文件存放目录下。
这里有一个实例

// 移动文件需要使用fs模块
   var fs = require('fs');
   app.post('/file-upload', function(req, res) {
     // 获得文件的临时路径
     var tmp_path = req.files.thumbnail.path;
    // 指定文件上传后的目录 - 示例为"images"目录。 
    var target_path = './public/images/' + req.files.thumbnail.name;
    // 移动文件
    fs.rename(tmp_path, target_path, function(err) {
      if (err) throw err;
      // 删除临时文件夹文件, 
      fs.unlink(tmp_path, function() {
         if (err) throw err;
         res.send('File uploaded to: ' + target_path + ' - ' + req.files.thumbnail.size + ' bytes');
      });
    });
  };

但是发现,express项目运行出错:

Error: Most middleware (like bodyParser) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.

查了一下官方文档,才发现:

In Express 4, req.files is no longer available on the req object by default. To access uploaded files on the req.files object, use a multipart-handling middleware like busboy, multer, formidable, multiparty, connect-multiparty, or pez.

解决问题,使用中间件。

支持文件上传中间件

因为时间有限,并没有做很深入的了解,看了下busboy的使用方法,感觉略麻烦。然后去multer看了下,发现其是在busboy上进行了封装,使其更加高效。决定使用它进行更新。

安装multer

npm install express multer multer --save
下面实例均来自Nodejs进阶:基于express+multer的文件上传

单图上传

nodeJs

var fs = require('fs');
var express = require('express');
var multer  = require('multer')

var app = express();
var upload = multer({ dest: 'upload/' });

// 单图上传
app.post('/upload', upload.single('logo'), function(req, res, next){
    res.send({ret_code: '0'});
});

app.get('/form', function(req, res, next){
    var form = fs.readFileSync('./form.html', {encoding: 'utf8'});
    res.send(form);
});

app.listen(3000);

html:

<form action="/upload-single" method="post" enctype="multipart/form-data">
    <h2>单图上传</h2>
    <input type="file" name="logo">
    <input type="submit" value="提交">
</form>

点击提交之后,图片会直接下载到服务器的指定目录下,也就是upload/目录。

多图上传

nodeJs

var fs = require('fs');
var express = require('express');
var multer  = require('multer')

var app = express();
var upload = multer({ dest: 'upload/' });

// 多图上传
app.post('/upload', upload.array('logo', 2), function(req, res, next){
    res.send({ret_code: '0'});
});

app.get('/form', function(req, res, next){
    var form = fs.readFileSync('./form.html', {encoding: 'utf8'});
    res.send(form);
});

app.listen(3000);

html:

<form action="/upload-multi" method="post" enctype="multipart/form-data">
    <h2>多图上传</h2>
    <input type="file" name="logo">
    <input type="file" name="logo">
    <input type="submit" value="提交">
</form>
获得图片信息

通过multer,我们可以获取:

  • 原始文件名
  • 文件大小
  • 本地保存路径
  • 文件类型
    与老的方法相似,multer将文件信息一并保存到了file对象中。

nodeJs

var fs = require('fs');
var express = require('express');
var multer  = require('multer')

var app = express();
var upload = multer({ dest: 'upload/' });

// 单图上传
app.post('/upload', upload.single('logo'), function(req, res, next){
    var file = req.file;

    console.log('文件类型:%s', file.mimetype);
    console.log('原始文件名:%s', file.originalname);
    console.log('文件大小:%s', file.size);
    console.log('文件保存路径:%s', file.path);

    res.send({ret_code: '0'});
});

app.get('/form', function(req, res, next){
    var form = fs.readFileSync('./form.html', {encoding: 'utf8'});
    res.send(form);
});

app.listen(3000);

html:

<form action="/upload" method="post" enctype="multipart/form-data">
    <h2>单图上传</h2>
    <input type="file" name="logo">
    <input type="submit" value="提交">
</form>

简单尝试之后,发现上传的文件有两个特性:

  • 文件名是一个hash字符串。而且上传同一个文件名称不一样。(之后再看源码,理解一下
  • 文件是无格式的,也就是说没有后缀名

笔者给其加入后缀名后即可浏览。所以现在需要做的就是自定义文件名。

自定义上传路径和文件名

自定义本地保存的路径,修改dest配置项。
var upload = multer({ dest: 'upload/' });

自定义文件名,需要使用mukter的Storage参数,来对资源的保存路径和文件名进行个性化设置。

  • destination:设置资源的保存路径。注意,如果没有这个配置项,默认会保存在 /tmp/uploads 下。此外,路径需要自己创建。
  • filename:设置资源保存在本地的文件名。

nodeJs

var fs = require('fs');
var express = require('express');
var multer  = require('multer')

var app = express();

var createFolder = function(folder){
    try{
        fs.accessSync(folder); 
    }catch(e){
        fs.mkdirSync(folder);
    }  
};

var uploadFolder = './upload/';

createFolder(uploadFolder);

// 通过 filename 属性定制
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, uploadFolder);    // 保存的路径,备注:需要自己创建
    },
    filename: function (req, file, cb) {
        // 将保存文件名设置为 字段名 + 时间戳,比如 logo-1478521468943
        cb(null, file.fieldname + '-' + Date.now());  
    }
});

// 通过 storage 选项来对 上传行为 进行定制化
var upload = multer({ storage: storage })

// 单图上传
app.post('/upload', upload.single('logo'), function(req, res, next){
    var file = req.file;
    res.send({ret_code: '0'});
});

app.get('/form', function(req, res, next){
    var form = fs.readFileSync('./form.html', {encoding: 'utf8'});
    res.send(form);
});

app.listen(3000);

html:

<form action="/upload" method="post" enctype="multipart/form-data">
    <h2>单图上传</h2>
    <input type="file" name="logo">
    <input type="submit" value="提交">
</form>

免责声明:文章转载自《NODEJS文件上传》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS-截取TableView生成图片Pytorch中adam优化器的参数问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Makefile系列之一 : 书写规则

1. 规则 target : prerequisites       command 2. example excute 为最终生成的可执行文件。 可以通过命令 make clean来删除所有编译时产生的中间文件。 excute : main.o a.o b.o c.o d.o cc -o excute main.o a.o b.o c.o d....

图文并茂基于阿里云linux服务器部署nodejs项目并添加pm2守护nodejs项目运行进程(Linux version 4.19.81-17.1.al7.x86_64)

首先你要有一台LINIX服务器,登入以后按下面步骤执行命令,可查看系统版本以及配置 查看Linux 内核 通过 uname -a 命令查看系统位数是64位 x86_64表示64位系统, i686 i386表示32位系统 uname -a cat /proc/version 补充信息 -- 查看当前系统版本的详细信息 1.cat /etc/redh...

input chrome下输入之后背景变为黄色的解决办法

之所以Input输入之后背景原因色变为可恶的黄色,是因为在chrome 下input加上了input:-webkit-autofill这个属性,里面写的就是这个问题出现的原因 代码就是:input:-wenkit-autofill:{background-color:黄色的;etc},解决办法有两个: 第一个解决办法就是:将你的input输入框中加入aut...

linux mv命令详解

Linux mv命令 Linux mv命令用来为文件或目录改名、或将文件或目录移入其它位置。 用法: mv [选项]... [-T] 源文件 目标文件 mv [选项]... 源文件... 目录 mv [选项]... -t 目录 源文件... 参数解释: --backup[=CONTROL] 为每个已存在的目标文件创建...

1009 Linux的文件系统介绍以及各种设备的说明

Linux的文件编程 linux文件管理系统分为3部分:与文件管理有关的软件,被管理的文件,实施文件管理需要的数据结构 用C语言建立,打开,关闭文件,向文件写入和读出数据等。Linux文件系统简介     从系统角度看:文件系统是对文件存储空间进行组织和分配,负责文件存储,并对存入的文件进行保护和检索的系统。负责为用户建立文件,存入,读出,修改,转存,控制...

Vue之项目搭建

  一、Vue自动化工具的安装 nvm:nodejs 版本管理工具。 也就是说:一个 nvm 可以管理很多 node 版本和 npm 版本。 nodejs:在项目开发时的所需要的代码库 npm:nodejs 包管理工具。 在安装的 nodejs 的时候,npm 也会跟着一起安装,它是包管理工具。 npm 管理 nodejs 中的第三方插件   1,安装nv...