七牛云前端(客户端)方式上传上传示例

七牛云前端(客户端)方式上传基本步骤

        1.前端请求后端获取上传凭证Token

        2.客户端携带Token直接上传文件到七牛云

        3.接收返回的url

1、服务器生成上传凭证 Token

OssController
package com.lesson.controller;


import com.lesson.common.utils.R;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author &papillon
 * @version 1.0
 * @description TODO
 * @date 2023-07-12 16:00
 */
@RestController
public class OssController {
    @Value("${qiniu.accessKey}")
    String accessKey;
    @Value("${qiniu.secretKey}")
    String secretKey;
    @Value("${qiniu.bucket}")
    String bucket;

    /**
     * 生成七牛云上传token
     */
    @GetMapping("/oss/policy")
    public R policy() {
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        return R.ok().put("data",upToken);

    }

}

附上核心代码相关联的代码

 application.yml

#七牛对象存储
qiniu:
   # 配置accessKey
   accessKey: 你自己的accessKey
   # 配置secretKey
   secretKey: 你自己的secretKey
   # 配置空间名称
   bucket: 你自己的bucket
   # 配置域名
   domain: 你自己的domain  #小提示:首次注册有一个月的测试域名,不可用于生产环境,但测试够了

 accessKey、accessKey获取方式

2、前端获取后端Token

将url地址改为后端生成Token的路径,因为在开发环境封装了基本请求路径(后面有例子index.js),所以不需要写完整路径

policy.js

import http from '@/utils/httpRequest.js'
export function policy() {
   return  new Promise((resolve,reject)=>{
        http({
            url: http.adornUrl("/oss/policy"),
            method: "get",
            params: http.adornParams({})
        }).then(({ data }) => {
            resolve(data);
        })
    });
}

附上核心代码相关联的代码

index.js

/**
 * 开发环境
 */
(function() {
  window.SITE_CONFIG = {};

  // api接口请求地址
  window.SITE_CONFIG["baseUrl"] = "http://localhost:88/api";

  // cdn地址 = 域名 + 版本号
  window.SITE_CONFIG["domain"] = "./"; // 域名
  window.SITE_CONFIG["version"] = ""; // 版本号(年月日时分)
  window.SITE_CONFIG["cdnUrl"] =
    window.SITE_CONFIG.domain + window.SITE_CONFIG.version;
})();

httpRequest.js

import Vue from 'vue'
import axios from 'axios'
import router from '@/router'
import qs from 'qs'
import merge from 'lodash/merge'
import { clearLoginInfo } from '@/utils'

const http = axios.create({
  timeout: 1000 * 30,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
})

/**
 * 请求拦截
 */
http.interceptors.request.use(config => {
  config.headers['token'] = Vue.cookie.get('token') // 请求头带上token
  return config
}, error => {
  return Promise.reject(error)
})

/**
 * 响应拦截
 */
http.interceptors.response.use(response => {
  if (response.data && response.data.code === 401) { // 401, token失效
    clearLoginInfo()
    router.push({ name: 'login' })
  }
  return response
}, error => {
  return Promise.reject(error)
})

/**
 * 请求地址处理
 * @param {*} actionName action方法名称
 */
http.adornUrl = (actionName) => {
  // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
  return (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : window.SITE_CONFIG.baseUrl) + actionName
}

/**
 * get请求参数处理
 * @param {*} params 参数对象
 * @param {*} openDefaultParams 是否开启默认参数?
 */
http.adornParams = (params = {}, openDefaultParams = true) => {
  var defaults = {
    't': new Date().getTime()
  }
  return openDefaultParams ? merge(defaults, params) : params
}

/**
 * post请求数据处理
 * @param {*} data 数据对象
 * @param {*} openDefaultData 是否开启默认数据?
 * @param {*} contentType 数据格式
 *  json: 'application/json; charset=utf-8'
 *  form: 'application/x-www-form-urlencoded; charset=utf-8'
 */
http.adornData = (data = {}, openDefaultData = true, contentType = 'json') => {
  var defaults = {
    't': new Date().getTime()
  }
  data = openDefaultData ? merge(defaults, data) : data
  return contentType === 'json' ? JSON.stringify(data) : qs.stringify(data)
}

export default http

3、客户端携带Token上传文件(vue2语法 + Element UI 组件)

注意:action="https://upload-z2.qiniup.com" 地址需要对应服务器地区,此处为华南地区,附上其他地区供参考:

存储区域地域简称上传域名
华东z0服务器端上传:http(s)://up.qiniup.com
华东z0客户端上传: http(s)://upload.qiniup.com
华北z1服务器端上传:http(s)://up-z1.qiniup.com
华北z1客户端上传: http(s)://upload-z1.qiniup.com
华南z2服务器端上传:http(s)://up-z2.qiniup.com
华南z2客户端上传: http(s)://upload-z2.qiniup.com
北美na0服务器端上传:http(s)://up-na0.qiniup.com
北美na0客户端上传: http(s)://upload-na0.qiniup.com
东南亚as0服务器端上传:http(s)://up-as0.qiniup.com
东南亚as0客户端上传: http(s)://upload-as0.qiniup.com

singleUpload.vue

注意:url前面一段http://xxxxx.com/需要改为你自己的域名,首次注册有赠送测试域名的,填上即可,代码中有提示

<template>
  <div>
    <el-upload
      action="https://upload-z2.qiniup.com"
      :data="dataObj"
      list-type="picture"
      :multiple="false"
      :show-file-list="showFileList"
      :file-list="fileList"
      :before-upload="beforeUpload"
      :on-remove="handleRemove"
      :on-success="handleUploadSuccess"
      :on-preview="handlePreview"
    >
      <el-button size="small" type="primary">点击上传</el-button>
      <div slot="tip" class="el-upload__tip">
        只能上传jpg/png文件,且不超过10MB
      </div>
    </el-upload>
    <el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="fileList[0].url" alt="" />
    </el-dialog>
  </div>
</template>
<script>
import { policy } from "./policy";
import { getUUID } from "@/utils";

export default {
  name: "singleUpload",
  props: {
    value: String
  },
  computed: {
    imageUrl() {
      return this.value;
    },
    imageName() {
      if (this.value != null && this.value !== "") {
        return this.value.substr(this.value.lastIndexOf("/") + 1);
      } else {
        return null;
      }
    },
    fileList() {
      return [
        {
          name: this.imageName,
          url: this.imageUrl
        }
      ];
    },
    showFileList: {
      get: function() {
        return (
          this.value !== null && this.value !== "" && this.value !== undefined
        );
      },
      set: function(newValue) {}
    }
  },
  data() {
    return {
      dataObj: {
        key: "",
        token: "",
        file: ""
      },
      dialogVisible: false
    };
  },
  methods: {
    emitInput(val) {
      this.$emit("input", val);
    },
    handleRemove(file, fileList) {
      this.emitInput("");
    },
    handlePreview(file) {
      this.dialogVisible = true;
    },
    beforeUpload(file) {
      //七牛云上传示例
      let _self = this;
      return new Promise((resolve, reject) => {
        policy()
          .then(response => {
            //上传的文件名使用uuid
            _self.dataObj.key = getUUID();
            //从服务端获取upToken
            _self.dataObj.token = response.data;
            resolve(true);
          })
          .catch(err => {
            reject(false);
          });
      });
    },
    handleUploadSuccess(res, file) {
      console.log("上传成功...");
      this.showFileList = true;
      this.fileList.pop();
      this.fileList.push({
        name: file.name,
//url前面一段http://xxxxx.com/需要改为你自己的域名,首次注册有赠送测试域名的,填上即可
        url:
          "http://xxxxx.com/" +
          "/" +
          this.dataObj.key.replace("${filename}", file.name)
      });
      this.emitInput(this.fileList[0].url);
    }
  }
};
</script>
<style></style>

4、结尾

到此,七牛云前端(客户端)方式上传 大功告成,如有不正确的地方欢迎指正!

七牛云官网

https://portal.qiniu.com/

七牛云官方文档

https://developer.qiniu.com/kodo/1239/java#upload-token

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值