vue+element-ui+node 上传图片到七牛云

注册七牛云,支付宝实名认证后方可开启存储空间权限

七牛云官网

七牛云开发者文档

选择对象存储,新建一个存储空间,里面包含你的文件外链

在node后端服务需要用到的数据就是

1、 空间名称bucket, 我这里就是 cwh-imglist
2、 SK 和 AK ,在控制面板的密匙管理
3、 储存空间的外链域名,在存储空间可以找到

接下来在我的node后端服务下载 七牛云的拓展  

cnpm i qiniu -S

完成node服务配置

在前端中,使用element-ui的  el-upload  组件

method里的函数


    //七牛云上传操作**********************************************************************************
    upqiniu(req) {
      const config = {
        headers: { "Content-Type": "multipart/form-data" }
      };
      let filetype = "";
      if (req.file.type === "image/png") {
        filetype = "png";
      } else {
        filetype = "jpg";
      }
      //取得图片名
      let uploadImgName = req.file.name.substring(
        0,
        req.file.name.indexOf(".")
      );
      // 重命名要上传的文件
      const keyname =
        "cwh-imglist_" + uploadImgName + "_" + new Date().getTime();
      "." + filetype;
      // 从后端获取上传凭证token,此处在前端配置proxyTable代理进行跨域
      axios.get("/upload/token").then(res => {
        const formdata = new FormData();
        formdata.append("file", req.file);
        formdata.append("token", res.data);
        formdata.append("key", keyname);
        // 获取到凭证之后再将文件上传到七牛云空间
        axios.post(this.domain, formdata, config).then(res => {
          this.imageUrl = "http://" + this.qiniuaddr + "/" + res.data.key;
        });
      });
    },
    // 验证文件合法性
    beforeUpload(file) {
      const isJPG = file.type === "image/jpeg" || file.type === "image/png";
      const isLt2M = file.size / 1024 / 1024 < 2;
      if (!isJPG) {
        this.$message.error("上传头像图片只能是 JPG、png 格式!");
      }
      if (!isLt2M) {
        this.$message.error("上传图片大小不能超过 2MB!");
      }
      return isJPG && isLt2M;
    }

在此处前端需要配置proxyTable反向代理进行跨域

完成前端上传到七牛云操作

将上传图片封装成upload.vue组件

<template>
  <div class="uploadPart">
    <el-upload
      class="avatar-uploader"
      :action="domain"
      :http-request="upQiniu"
      :show-file-list="false"
      :before-upload="beforeUpload"
    >
      <img v-if="imageUrl" :src="imageUrl" class="avatar" />
      <div v-else>
        <i v-if="isNewEdit" class="el-icon-plus avatar-uploader-icon"></i>
        <img v-else :src="firstPicUrl" class="avatar" />
      </div>
    </el-upload>
  </div>
</template>

<script>
import { qiniuDomain } from "../../API/qiniuDomain";
import axios from "axios";
export default {
  props: {
    isNewEdit: {
      type: Boolean,
      default: false
    },
    firstPicUrl: {
      type: String,
      default: ""
    }
  },
  data() {
    return {
      //七牛云数据变量
      imageUrl: "", //预览的图片地址
      token: {},
      // 七牛云的上传地址,根据自己所在地区选择,我这里是华南区
      domain: "https://upload-z2.qiniup.com",
      // 这是七牛云空间的外链默认域名
      qiniuaddr: qiniuDomain
    };
  },
  methods: {
    //七牛云上传操作**********************************************************************************
    upQiniu(req) {
      const config = {
        headers: { "Content-Type": "multipart/form-data" }
      };
      let filetype = "";
      if (req.file.type === "image/png") {
        filetype = "png";
      } else {
        filetype = "jpg";
      }
      //取得图片名
      let uploadImgName = req.file.name.substring(
        0,
        req.file.name.indexOf(".")
      );
      // 重命名要上传的文件
      const keyname =
        "cwh-imglist_" +
        uploadImgName +
        "_" +
        new Date().getTime() +
        "." +
        filetype;

      //   this.currentPicUrl = keyname;
      //向父组件抛出最新的图片
      this.$emit("set_currentPicUrl", keyname);

      // 从后端获取上传凭证token,此处在前端配置proxyTable代理进行跨域
      axios.get("/upload/token").then(res => {
        const formdata = new FormData();
        formdata.append("file", req.file);
        formdata.append("token", res.data);
        formdata.append("key", keyname);
        // 获取到凭证之后再将文件上传到七牛云空间
        axios.post(this.domain, formdata, config).then(res => {
          this.imageUrl = "http://" + this.qiniuaddr + "/" + res.data.key;
        });
      });
    },
    // 验证文件合法性
    beforeUpload(file) {
      const isJPG = file.type === "image/jpeg" || file.type === "image/png";
      const isLt2M = file.size / 1024 / 1024 < 2;
      if (!isJPG) {
        this.$message.error("上传头像图片只能是 JPG、png 格式!");
      }
      if (!isLt2M) {
        this.$message.error("上传图片大小不能超过 2MB!");
      }
      return isJPG && isLt2M;
    }
  }
};
</script>

<style lang="less" scoped>

参考链接:vue前端(element-ui),express后端实现上传图片到七牛云

发布了142 篇原创文章 · 获赞 54 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/CWH0908/article/details/103916291
今日推荐