美文网首页Node.js
node上传图片到七牛云上更换头像

node上传图片到七牛云上更换头像

作者: 宇cccc | 来源:发表于2017-08-25 10:40 被阅读0次

node怎么上传头像到七牛云然后更换头像,之前也做过这个小功能.
个人说说如何实现以及几个坑点.前端基于vue(基于什么都无所谓),后端node+express

前端代码

拿到图片流 发送到后端node

var file = e.target.files[0]
        // 判断是否图片
        if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {
          alert('图片类型必须是.gif,jpeg,jpg,png,bmp中的一种')
          return false
        }
// 主要利用 FileReader 对象 
        var reader = new FileReader()
        reader.readAsDataURL(file)
        reader.onload = (e) => {
          // e.target.result 就是要上传到后端的图片流 base64 
          // 一般情况下不会选择完图片就立刻请求上传接口
          // 有可能进行裁切,旋转等等操作 点击确定之后才将数据流上传到后端
        }

这里有个问题: 如果你想上传多张图片到后端 比如 files = [{img1:xx}, {img2: xx}] express 需要序列化之后才能接收到对象类型 => JSON.stringify(files)

创建七牛云存储

创建一个七牛云账号: 创建一个对象存储,不懂请百度...
新建存储空间: 一定要选择华东 不然后面会上传失败.
假设我创建了一个空间名为: avatar-img-d

后端代码:

下载七牛云模块
地址 https://github.com/node-modules/qn

 cnpm i qn -S

code

// 读写文件模块
var fs = require('fs');
// 七牛云模块
var qn = require('qn');
// 空间名
var bucket = 'avatar-img-d';
// 七牛云配置
var client = qn.create({
// 秘钥在控制模板->个人中心->密钥管理中可以看到
    accessKey: '填写你的秘钥',
    secretKey: '填写你的秘钥',
// 空间名
    bucket: bucket,
// 这个是你要生成的前缀(你的外链地址,可以在空间中查看)
// 其实写不写都行,不写后面也得写.
    origin: 'http://ouibvkb9c.bkt.clouddn.com'
})

如下图:

image.png

配置已经完成,写接口 用的是express, koa同理
主要做法是先接收前端的图片流 转换成图片写入本地image文件中,然后再存储到七牛云,再将本地生成的图片删除,需要新建一个image文件夹

// 上传图片
router.post('/upload', function (req, res, next) {
    // 接收前端图片数据流
    var imgData = req.body.imgData;
    // 构建图片名 这个主要是生成唯一图片名字利于存储 当然为了方便就写时间戳 实际开发可千万别 可能出现两人同一时间
    var fileName = Date.now() + '.png';
    // 构建图片路径 需要在上一层目录下新建一个image
    var filePath = './image/' + fileName;
    // 过滤data:URL
    var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
    var dataBuffer = new Buffer(base64Data, 'base64');
    fs.writeFile(filePath, dataBuffer, function (err) {
        if (err) {
 // 写入失败
            res.end(JSON.stringify({status: '102', msg: '文件写入失败'}));
        } else {
// 写入成功 上传七牛云 filePath 代表刚刚写入本地图片的路径
// {key: `/avatar/${fileName}`}    avatar 代表我要存在七牛云这个路径下 您随意 
// fileName 代表刚刚生成的文件名
            client.uploadFile(filePath, {key: `/avatar/${fileName}`}, function (err1, result) {
                if (err1) {
                    res.json({
                        status: '1',
                        msg: '上传失败'
                    });
                } else {
                    res.json({
                        status: '0',
                        result: {
                            path: result.url
                        },
                        msg: 'suc'
                    })
                }
                // 上传之后删除本地文件
                fs.unlinkSync(filePath);
            });
        }
    })
})

如下图:

image.png

大功告成,如此就将前端发送过来的图片流成功上传到七牛云上,最后再写一个更换头像路径的接口就好了.

源码前端项目地址: 戳我
源码node项目地址:戳我

相关文章

网友评论

    本文标题:node上传图片到七牛云上更换头像

    本文链接:https://www.haomeiwen.com/subject/wgfudxtx.html