Notes for a front-end developer, esyou.net

0%

NODE+EXPRESS图片上传实例

如果使用node+express作为后端的话,肯定是避免不了上传的,因此我们需要使用node+express来对图片或者其他文件进行上传。如果你不使用express也是可以的。这里我们需要使用到一个node插件formidable,这个插件主要提供的就是上传功能。下面开始我们的项目吧。
首先你得搭建node+express环境,如果不知道怎么搭建的,请自行百度,文章前半部分有关于环境搭建的说明。搭建完成后,我们需要安装formidable插件,在node中插件安装的方法就是直接使用命令,在项目当前目录下,直接执行npm install xxxx –save(xxxx是插件名称,–save则是将插件写入packge.json文件中)即可安装插件,如此安装formidable就使用以下命令即可:

1
npm install formidable --sava

也可以使用简写的命令

1
npm i -S formidable //(i即install,-S,这里的s是大写的,即sava)

安装完成之后,我们首先直接在index.ejs或者index.jade中添加一个表单form,内容如下:

1
<form action="/upload" method="post" enctype='multipart/form-data'>
2
    <input name="avatar" type="file" />
3
    <button type="submit">上 传</button>
4
</form>

下面该是写上传功能的router了,通过express的router的post来实现上传,我们打开routers目录下的index.js添加下面的代码

1
//在顶部代码中加入如下代码
2
var formidable = require('formidable');
3
var fs = require('fs');
4
//在module.exports = router;之前添加下面的代码
5
6
//上传图片
7
router.post('/upload', function(req, res, next){
8
  var   AVATAR_UPLOAD_FOLDER = '/avatar/'   //首先必须在public目录下创建一个名字为avatar的文件夹,否则上传会报错,因为此程序无法自动创建目录
9
  var form = new formidable.IncomingForm();   //创建上传表单
10
  form.encoding = 'utf-8';      //设置编辑
11
  form.uploadDir = 'public' + AVATAR_UPLOAD_FOLDER;  //设置上传目录
12
  form.keepExtensions = true;    //保留后缀
13
  form.maxFieldsSize = 2 * 1024 * 1024;   //文件大小
14
15
  form.parse(req, function(err, fields, files) {
16
17
    if (err) {
18
      //res.locals.error = err;
19
      res.json({'avatar':'error'}); //发生错误后输出json内容为avatar:error
20
      return;
21
    }
22
//设置允许上传的文件,这里我设置的是图片,你也可以直接设置成rar、zip、doc等
23
        var extName = '';  //后缀名
24
    switch (files.avatar.type) { //这里的avatar就是我们之前表单中input[type=file]的name值,别搞错了
25
        case 'image/pjpeg':
26
            extName = 'jpg';
27
            break;
28
        case 'image/jpeg':
29
            extName = 'jpg';
30
            break;
31
        case 'image/png':
32
            extName = 'png';
33
            break;
34
        case 'image/x-png':
35
            extName = 'png';
36
            break;
37
        }
38
        //如果没有查找到.jpg、.png的后缀名,则提示错误信息
39
    if(extName.length == 0){
40
        //res.locals.error = '只支持png和jpg格式图片';
41
        res.json({'avatar':'不支持的类型'});
42
        return;
43
    }
44
        //重新修改文件名字,使用随机数作为图片名字
45
    var avatarName = Math.random() + '.' + extName;
46
    var newPath = form.uploadDir + avatarName;
47
        //得到上传后的图片相对路径
48
    console.log(newPath);
49
    fs.renameSync(files.fulAvatar.path, newPath);  //重命名
50
    //返回json,json内容为图片相对路径
51
    //res.locals.success = '上传成功';
52
    res.json({'avatar':newPath});
53
    });
54
});

代码完成了,赶快输入http://localhost:3000查看效果吧,看看上传是否已经成功了。
另外如果想要了解formidable的api的童鞋,请直接移步到npm:https://www.npmjs.com/package/formidable