美文网首页藏兵谷Web前端之路让前端飞
element UI+七牛云快速搭建图片服务器

element UI+七牛云快速搭建图片服务器

作者: xujingguo | 来源:发表于2017-05-17 23:34 被阅读3814次

    最进在做网站的后台管理功能,需要能够对数据库的文章进行“增,删,改,查”,但是遇到了图片保存的问题,如果采用前端上传图片至后端,然后后端保存,数据库存储图片的相对路径,这种方式感觉有点麻烦,于是就在寻求更简单的解决方案,那么有没有一种前端上传图片存储,直接返回图片外链的解决方案呢?

    ​ 最终,我选择了element UI +七牛云对象存储来快速搭建图片服务器的解决方案。

    element UI

    element UI是饿了么出品的一套基于vue的开元UI组件库,提供了非常强大的文件上传功能,只要指定上传url就可以使用ajax实现图片的上传,并且支持拖拽功能。

    七牛云对象存储

    在七牛网注册后并且实名认证后会有10G的永久免费的对象存储,我们利用这10个G的存储基本可以满足我们的日常需要。

    具体实现

    1.注册七牛云

    首先,注册七牛云,并且完成实名认证(七牛云的实名认证可以通过支付宝来授权验证,很方便),完成后会在个人中心->秘钥管理中看到两个秘钥AccessKey/SecretKey,然后创建自定义名字的对象存储空间,

    在创建存储空间的时候,可以选择私人空间,但是图片的外链访问都需要秘钥,公共空间则不需要。

    为了实现上传,我们还需要生成上传凭证,关于凭证,可以参看文档,并且在文档结束后还有demo,因为是个人项目,为了简单,我直接从demo中生成了deadline为1000多小时的秘钥,确保不会过期,

    填入ak,sk,以及bucketName(就是开始创建的对象存储空间的名字),deadline修改demo的源代码再重新运行即可。

    生成token后,就可以实现上传了。

    2.引入element UI

    关于element UI的安装和引入可以参见官网的文档,引入完成后就可以在vue文件中的template中使用文件上传组件,注意,上传组件默认是自动上传的,即选择完图片就可以直接上传,不需要额外的事件来触发。

    代码如下:

    <el-upload
        action="http://upload-z1.qiniu.com"  
        :drag="true"
        :on-success="handleAvatarSuccess"
        :on-error="handleError"
        :before-upload="beforeAvatarUpload"
        :data="postData">
        ![](imageUrl)
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em>      </div>
        <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不      超过500kb</div>
    </el-upload>
    

    渲染效果:

    参数说明:

    action是上传的URL,为必选项,
    drag表示是否支持拖拽
    on-success钩子,上传成功
    on-error上传失败
    before-upload上传之前,可以用来判断上传类型是否符合要求,不符合停止上传
    data是一个对象,用来表示上传时附带的额外参数
    

    这个URL是由七牛云提供,在创建存储空间的时候会选择地区,不同的地区有不同的URL,而且http和https也是不同的URL,具体可以参见官方文档。

    由于七牛云的上传需要秘钥,所以需要定义额外的data来上传附带的额外参数。

    script标签中,定义一个对象保存token

    postData: {
        token: 'your token'
    }
    

    js代码:

    methods: {
          handleAvatarSuccess(res, file) {   //上传成功后在图片框显示图片
            this.imageUrl ='http://oq34prjoz.bkt.clouddn.com/'+ res.key
            console.log(res)
          },
          handleError(res) {   //显示错误
            console.log(res)
          },
          beforeAvatarUpload(file) {    //在图片提交前进行验证
            const isJPG = file.type === 'image/jpeg'
            const isPNG = file.type === 'image/png'
            const isLt2M = file.size / 1024 / 1024 < 2
    
            if (!isJPG&&!isPNG) {
              this.$message.error('上传头像图片只能是 JPG/PNG 格式!')
            }
            if (!isLt2M) {
              this.$message.error('上传头像图片大小不能超过 2MB!')
            }
            return isJPG && isPNG && isLt2m
          }
        }
    

    上传成功后会返回一个对象,包含一个hash和一个key,然后前边加上七牛云为你随机分配的域名就是图片的外链,

    http://oq34prjoz.bkt.clouddn.com/'+ res.key
    

    最终结果如下:

    在七牛云的管理平台中,就可以看到我们上传的图片了

    相关文章

      网友评论

      • 逍遥_3d41:楼主,我按你的步骤写好后,但是上传不到七牛云,能给指点一下么
      • 异木棉:你好,请问action上传的URL是怎么来的,后台给了我一个URL,但是放在action里面报错 “Document not found”???
        xujingguo:@异木棉 这个URL是由七牛云提供的,不同的镜像存储区域有不同的URL,具体可以参见这篇官方帮助文档 https://developer.qiniu.com/kodo/manual/1671/region-endpoint
      • lalxyy:难道是我东大校友2333
        xujingguo: @lalxyy 233 被发现了
      • 好好顽:好想法 用这个可以拿来做markdown图床阿!!
        b432c293d445:@为鹤而隐_1ff0 可以 通过 返回 一个Promise 对象 -> 后台获取 token -> 成功 返回 resolve() 也就是接下里 执行 onSuccess的回调,否则返回 reject
        为鹤而隐_1ff0:楼主,有个问题想请教下,我先获取token然后直接在postData: {
        token: '获取到的token'
        },
        才能上传成功,如果在beforeAvatarUpload里通过我的后台去获取token,再赋值postData,结果是:第一次失败,第二次才会成功,请问楼主这个问题怎么解决的?(因为我是判断文件类型再来获取token,所以token不能写死),期待楼主的回复!
        xujingguo: @好好顽 是的,这篇博客的图片都是用这个方法来的

      本文标题:element UI+七牛云快速搭建图片服务器

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