vue前端上传文件到COS

2023-10-31

1:main.js中

//COS相关的
Vue.prototype.loadi = 'https://images-1254950508.cos.ap-guangzhou.myqcloud.com/a/1588390454918/loading.gif';
console.log(process.env.VUE_APP_serverUrl);
Vue.prototype.$baseUrl = process.env.VUE_APP_serverUrl;
Vue.prototype.fileCos = function (_obj,callback){
    let options = {
        url: '/fileUpload/cos/credential',
        method: 'GET',
    }

    request(options).then(res => { //获取cos令牌
        if(res.code == 0) {
            var cosArg = res.data
            var cos = new COS({
                getAuthorization: function (options, callback) {
                    callback({
                        TmpSecretId: res.data.credentials && res.data.credentials.tmpSecretId,
                        TmpSecretKey: res.data.credentials && res.data.credentials.tmpSecretKey,
                        XCosSecurityToken: res.data.credentials && res.data.credentials.sessionToken,
                        ExpiredTime: res.data.expiredTime
                    });
                }
            })
            var cosKey = `${cosArg.keyPrefix}/${new Date().getTime()}/${_obj.name}`
            cos.putObject({
                Bucket: cosArg.bucket,
                Region: cosArg.region,
                Key: cosKey,
                Body: _obj,
            }, (err, res) => {
                if (!err) {
                    if(res.Location.indexOf('https://') == -1){
                        res.Location = 'https://' + res.Location;
                    }
                    // console.log('图片已经传到cos服务器')
                    // console.log(res)
                    var _data = {
                        'url' : res.Location, // 文件路径
                        'name' : _obj.name, // 文件名
                        'type' : _obj.type, // 文件类型 如:image/jpeg
                        'size' : parseInt(_obj.size/1024), // 文件大小
                    }
                    callback(_data);
                }
            })
        }else {
            this.$Message.error({
                content: '上报错误:'+res.msg,
                duration: 0,
                closable: true,
            })
        }
    }).catch(error => {
        console.log(error)
    })
}

2:页面上调用

<template>
    <div class="container lzyBox">
      <div class="main-hd">信息发布管理>招商项目>新建</div>

      <div class="main-bd">
          <vue-ueditor-wrap v-model="msg" :config="myConfig"></vue-ueditor-wrap>
          <button >保存</button>
      </div>


      <input
                type="file"
                id="ipa_file-selector"
                :data-dir="app_id"
                data-name="game"
                @change="ipa_selectFile"
              />

    </div>
</template> 
<script type="text/javascript" src="./static/js/cos-js-sdk-v5.min.js"></script> 
<script>
import VueUeditorWrap from 'vue-ueditor-wrap'
import COS  from 'cos-js-sdk-v5'
export default {
  name: 'App',
  components: {
    VueUeditorWrap,
  },
  data () {
    return {
      msg: '<h2><img src="http://img.baidu.com/hi/jx2/j_0003.gif"/>Vue + UEditor + v-model双向绑定</h2>',
      myConfig: {
        // 编辑器不自动被内容撑高
        autoHeightEnabled: false,
        // 初始容器高度
        initialFrameHeight: 240,
        // 初始容器宽度
        initialFrameWidth: '100%',
        // 上传文件接口(这个地址是我为了方便各位体验文件上传功能搭建的临时接口,请勿在生产环境使用!!!)
        // serverUrl: 'http://35.201.165.105:8000/controller.php',
        // UEditor 资源文件的存放路径,如果你使用的是 vue-cli 生成的项目,通常不需要设置该选项,vue-ueditor-wrap 会自动处理常见的情况,如果需要特殊配置,参考下方的常见问题2
        UEDITOR_HOME_URL: '/UEditor/'
      },
      app_id:'/src/assets/logo.png'
    }
  },

  computed: {
  },
  methods: {
    onEditorReady(editor) {// 准备编辑器
    },
    onEditorBlur(){// 失去焦点事件
    }, 
    onEditorFocus(){// 获得焦点事件
    }, 
    onEditorChange(){// 内容改变事件
    }, 

    //------------------------------------COS做测试-----------------------------------------
    ipa_selectFile(){
        //console.log(document.getElementById('ipa_file-selector').files[0])
        //这里是给可能会看不懂的同学看的,vue不建议操作DOM,能用ref的用ref。
        var file = document.getElementById('ipa_file-selector').files[0]   
        if (!file) return;
        this.fileCos(file,function(_data){
            console.log(_data)
            // _dom.splice(_l,1,_txt.url);
        })
	    }
  }
}
</script>   

springboot中Controller

package com.tengyun.investment.backend.sys.controller;


import com.tengyun.common.model.R;
import com.tengyun.common.utils.FileUploadService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 图片上传工具类
 */
@RestController
@RequestMapping("/fileUpload")
public class FileUploadController {
    @Autowired
    FileUploadService fileUploadService;


    @ApiOperation(value = "获取cos临时签名")
    @GetMapping("/cos/credential")
    R getCredential() {
        return R.ok().put("data",fileUploadService.getCredential());
    }
}

servece层

/**
     * 前端上传的临时密钥
     */
    public Map<String, Object> getCredential() {
        TreeMap<String, Object> config = new TreeMap<String, Object>();

//        try {
            config.put("SecretId", secret_id);
            config.put("SecretKey", secret_key);
            // 临时密钥有效时长,单位是秒,默认1800秒,最长可设定有效期为7200秒
            config.put("ExpiredTime", 7200);
//            config.put("bucket", bucketName + "-" + appid);
            config.put("bucket", bucketName);
            config.put("region", regionName);
            // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子:a.jpg 或者 a/* 或者 * 。
            // 如果填写了“*”,将允许用户访问所有资源;除非业务需要,否则请按照最小权限原则授予用户相应的访问权限范围。
            config.put("allowPrefix", "*");

            // 密钥的权限列表。简单上传、表单上传和分片上传需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
            String[] allowActions = new String[]{
                    // 简单上传
                    "name/cos:PutObject",
                    "name/cos:GetObject",
                    "name/cos:DeleteObject",
                    // 表单上传、小程序上传
                    "name/cos:PostObject",
                    // 分片上传
                    "name/cos:InitiateMultipartUpload",
                    "name/cos:ListMultipartUploads",
                    "name/cos:ListParts",
                    "name/cos:UploadPart",
                    "name/cos:CompleteMultipartUpload"
            };
            config.put("allowActions", allowActions);
        Map<String, Object> map = null;
        try {
            map = CosStsClient.getCredential(config).toMap();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //成功返回临时密钥信息,如下打印密钥信息
            map.put("keyPrefix", key);
            String bucket = bucketName;
            map.put("bucket", bucket);
            map.put("region", regionName);
            return map;
    }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue前端上传文件到COS 的相关文章

  • Git&&Github配置

    1 把现有的 ssh key 都删掉或查找现有的key PS 如果多打空格可能要破环系统 删掉现有的Key rm rf ssh 查找现有的Key 如果没有 bash终端显示如下 No such file or directory 如果已经存

随机推荐

  • 常见Windows Server漏洞处理方法

    常见的几种漏洞 mysql 3306 Oracle 1521 Redis 6379 Tomcat 8080 445 138端口不安全 weblogic Server 7001 3389远程桌面 下面分别讲解几种漏洞解决的方法 一 mysql
  • CH06_第一组重构(下)

    封装变量 Encapsulate Variable 132 曾用名 自封装字段 Self Encapsulate Field 曾用名 封装字段 Encapsulate Field let defaultOwner firstName Mar
  • C++的强制类型转换

    关于强制类型转换的问题 很多书都讨论过 写的最详细的是C 之父的 C 的设计和演化 最好的解决方法就是不要使用C风格的强制类型转换 而是使用标准C 的类型转换符 static cast dynamic cast 标准C 中有四个类型转换符
  • 在docker上安装spark

    拉安装好spark的镜像 https hub docker com r bde2020 spark master docker pull bde2020 spark master 安装master节点 docker run name spa
  • SpringBoot 整合shiro框架

    网上有很多整合shiro的博客分享 但是貌似没找到一个完整 并且能够实现的 不是包的问题 就是代码的问题 也可能是自己的问题 或者版本的问题 所以 整理了一版自己已应用的 maven依赖
  • Netty 入门实战

    Netty 入门实战 异步事件驱动的Java开源网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端 Netty 项目旨在为可维护的高性能和高可伸缩性协议服务器和客户端的快速开发提供一个异步事件驱动的网络应用框架和工具 Netty
  • Kafka概述

    Kafka概述 Kafka 基础架构 生产者消息发送流程 生产者发送消息示例 分区的好处 生产者如何提高吞吐量 可靠性总结 幂等性问题 Kafka 事务 生产者乱序问题 kafka是一个多分区 多副本且基于zookeeper协调的分布式消息
  • wsl连接vscode

    文章目录 1 wsl 安装 2 wsl搭配vscode 3 adb 在wsl上的使用 1 wsl 安装 由于我已经提前安装了 所以这里没办法展示如何安装 大致有两个需要注意的点 在官网或者其它博文有 1 需要在命令行输入安装命令 2 需要下
  • python-循环

    文章目录 循环 是什么 定义 分类 做什么 怎么用 语法 If 语法 If 基本语法 If else if elif else 结构 if 嵌套 while 语法 while 基本语法 while else while else break
  • 费曼学习法简述

    你真的已经对某个知识点足够深入了吗 还是只是停留在一个肤浅的阶段 不妨试试费曼学习法 让自己的思考更加深入 费曼学习法 主要分为四个阶段 下面针对这四个步骤进行详述 选择概念 选择一个你想学习的概念 讲授概念 你对面的是一个10岁孩童 试图
  • 操作系统复习知识点(第四章、第五章)

    存储器管理 1 多层结构的存储器系统 存储器的多层结构 存储层次至少应具有三级 最高层为 CPU 寄存器 中间为主存 最底层是辅存 还可以根据具体的功能分工细划为寄存器 高速缓存 主存储器 磁盘缓存 固定磁盘 可移动存储介质等 6 层 在存
  • Mad Scientist (纯模拟题)

    Mad Scientist 题目描述 Farmer John s cousin Ben happens to be a mad scientist Normally this creates a good bit of friction a
  • QT--3.创建一个简单的图形界面

    创建一个简单的图形界面 1 qt基础 qt的移植性非常强 2 做一个简单的qt界面 1 创建一个工程 2 项目选择Application 然后选择Qt Widgets Application 最后选择choose 注意 创建项目的名称和路径
  • 对象池简单理解

    unity中一些需要频繁创建和销毁的对象 在销毁时会频繁的调用gc 非常占用cpu时 造成性能瓶颈 这时候就需要对象池技术 使用对象池在销毁时并不调用gc 而是仅仅将需要销毁的obj失活 当再次创建同类对象时 在对象池中查找可以使用的对象进
  • C语言练习——输出字符串长度

    输出字符串长度 题目描述 代码实现 方法一 方法二 方法三 方法四 题目描述 写一个函数 求一个字符串的长度 在 main 函数中输入字符串 并输出其长度 代码实现 方法一 include
  • linux oracle 临时空间不足,oracle for linux服务器磁盘空间不足,通过过期的文件释放磁盘空间...

    2013 09 16截取的数据 使用df h命令查看系统磁盘空间 root erpdbs PROD df h Filesystem Size Used Avail Use Mounted on dev sda5 4 9G 241M 4 4G
  • CCPC2019河南省省赛总结:lwh

    之前的邀请赛突然变成省赛 多了次拿牌的机会 还挺开心的 然后旷了2节课和队友去打了网络赛 成绩还不错 应该能够拿个金 然后就是现场赛了 不知道什么原因 现场赛开始前推迟了20分钟 比赛开始 开始一眼望过去 学长选了题 签到题直接敲 样例过了
  • mysql 列名映射_[Mybatis] Mybatis处理列名->字段名映射(二) - AS用法 & ResultMap

    前言 考虑到在Select时使用AS和方案一其实没什么差别 在介绍ResultMap之前 顺便带过一下 方案二 Select AS 当我们的数据库列名和对象字段之间不是驼峰式命名的关系 我们可以在Select时使用AS 使得列名和对象名匹配
  • BTY Ecosystem DNS‘s Ideas of DeSoc

    In May 2022 Ethereum founder Vitalik Buterin economist Glen Weyl and Flashbots researcher Puja Ohlhaver jointly released
  • vue前端上传文件到COS

    1 main js中 COS相关的 Vue prototype loadi https images 1254950508 cos ap guangzhou myqcloud com a 1588390454918 loading gif