vue+koa做图片上传

vue图片上传,使用elementui上传组件
前端选择图片后,立即上传(也可以手动上传)
后台koa监听请求路由,处理数据,将上传的图片生成一个url返回给前端
前端将url,连同别的数据一并提交给后端,写入数据库

vue前端代码部分
<el-upload
            action="http://localhost:3001/api/upload"   //上传图片的地址
            list-type="picture-card"   //选择后缩略图展示
            multiple  //允许选择多图
            :on-preview="preview"   //点击查看图片预览的处理方法
            :on-success="afterSuccessUpload"   //自动上传成功后的回调
          >
            <i class="el-icon-plus"></i>
 </el-upload>
<el-dialog :visible.sync="dialogVisible">   //下面是图片缩略图部分
            <img width="100%" :src="dialogImageUrl" alt />
</el-dialog>

methods方法:
    preview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
  afterSuccessUpload(file) {
      console.log(file)  //上传成功后,后台会返回前台一个图片链接,把这个链接后续写入数据库
    },

下面是koa后台的处理方法,需要使用koa-multer插件
一般会先去封装一个upload方法,放到models目录里,供后续代码使用
koa后台路由监听post的上传请求,然后通过调用upload方法,处理上传文件,生成链接,返回给前端

首先是封装upload.js代码部分
const multer = require('koa-multer')
const path=require("path");
const destPath=path.join(__dirname,"../uploadImgs");
//配置
var storage = multer.diskStorage({
    //文件保存路径
    destination: function (req, file, cb) {
        cb(null, destPath)
    },
    //修改文件名称
    filename: function (req, file, cb) {
        var fileFormat = (file.originalname).split(".");  //以点分割成数组,数组的最后一项就是后缀名
        cb(null, Date.now() + "." + fileFormat[fileFormat.length - 1]);
    }
})
//加载配置
var upload = multer({
     storage: storage,
     limits: {
        fileSize: 1024*1024/2 // 限制512KB
      }
});

module.exports=upload;

将上述模块暴露出去以后,koa路由处理方法,就可以使用了

koa后台监听post请求,将图片上传后生成链接返回前端
const upload = require("../models/upload.js")
router.post('/upload', upload.single('file'), async (ctx, next) => {
    ctx.body = {
        filename: ctx.req.file.filename
    }
})
这样前端就会获得一个图片链接,前端和别的数据一并传给后端,写入数据库

·······························································································
下面是vue+koa上传到七牛云的案例
前端要上传图片到七牛云,需要有一个token进行授权操作
难点在于要使用后端koa生成一个token授权给前端
每次需要上传前,前端向后端申请一个token
前端直传图片到七牛云,七牛云返回前端一个图片url
前端把url连同别的信息,一并提交给后台,写入数据库

第一,服务端颁发上传凭证到前端,前端携带凭证,采用“客户端直传”的方式直接上传到七牛云。
先写后端部分吧,需要使用到官方提供的node.js    sdk
1. 安装七牛云依赖   npm i qiniu
2. 在api模块引入七牛云   const qiniu = require("qiniu");
生成token部分代码如下
router.get("/getuploadtoken", async (ctx, next) => {
    const accessKey = 'MxExXov-';   //秘钥管理中的AK
    const secretKey = 'ETapkF';    //秘钥管理中的SK
    const bucket = "vueimgs";     //创建的存储空间文件夹名字
    const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
    const options = {
        scope: bucket,
        expires: 3600 * 24,    //过期时间
    };
    const putPolicy = new qiniu.rs.PutPolicy(options);
    const uploadToken = putPolicy.uploadToken(mac);
    ctx.body = uploadToken;   //当前端请求获得token的时候,就把生成的token返回给前端
})


vue前端部分
<el-upload
            action="http://upload.qiniup.com"     //这个地址,和七牛上创建时选择的区域有关
            list-type="picture-card"
            :on-preview="preview"
            :on-success="afterSuccessUpload"
            :data="postData"
          >
            <i class="el-icon-plus"></i>
 </el-upload>
其中的 :data="postData"是用来放七牛云的token的
data里面需要放一个postData: {    token:""    }
created里面进入即调用一个methods里面定义的方法,获取token的方法
getUploadToken(){
      this.$http.get("/getuploadtoken")
        .then(res=>{
          this.postData.token=res.data;
        })
    }
一进入上传页面,即请求token

afterSuccessUpload(res) {
      this.form.img = "http://py0mg402k.bkt.clouddn.com/" + res.key;
    },
选中图片后直接上传,上传后七牛返回给前端一个res,把bucket文件url+res.key即可生成图片链接

上传地址,参考 (官方文档)
token生成,参考官方文档
感谢前辈的文档,EsunR
陌上兮月

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容