Git Product home page Git Product logo

cos-js-sdk-v5's Introduction

cos-js-sdk-v5

腾讯云 COS JS SDK(XML API

releases and changelog

Get started

一、前期准备

  1. 首先,JS SDK 需要浏览器支持基本的 HTML5 特性,以便支持 ajax 上传文件和计算文件 md5 值。
  2. COS对象存储控制台 创建存储桶,得到 Bucket(由bucketname-appid 组成,appid必须填入) 和 Region(地域名称)
  3. 控制台密钥管理 获取您的项目 SecretId 和 SecretKey
  4. 配置 CORS 规则,配置例子如下图:

cors

二、计算签名

由于签名计算放在前端会暴露 SecretId 和 SecretKey,我们把签名计算过程放在后端实现,前端通过 ajax 向后端获取签名结果,正式部署时请在后端加一层自己网站本身的权限检验。

这里提供 PHP 和 NodeJS 的签名例子,其他语言,请参照对应的 XML SDK

三、上传例子

  1. 创建 test.html,填入下面的代码,修改里面的 Bucket 和 Region。
  2. 部署好后端的签名服务,并修改 getAuthorization 里的签名服务地址
  3. 把 test.html 放在 Web 服务器下,然后在浏览器访问页面,测试文件上传
<input id="file-selector" type="file">
<script src="dist/cos-js-sdk-v5.min.js"></script>
<script>
  
// 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
var Bucket = 'test-1250000000';
// 存储桶Region可以在COS控制台指定存储桶的概览页查看 https://console.cloud.tencent.com/cos5/bucket/ 
// 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
var Region = 'ap-guangzhou';

// 初始化实例
var cos = new COS({
    getAuthorization: function (options, callback) {
        var url = '../server/sts.php'; // 这里替换成您的服务接口地址
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.onload = function (e) {
            try {
                var data = JSON.parse(e.target.responseText);
                var credentials = data.credentials;
            } catch (e) {
            }
            if (!data || !credentials) return console.error('credentials invalid');
            callback({
                TmpSecretId: credentials.tmpSecretId,
                TmpSecretKey: credentials.tmpSecretKey,
                XCosSecurityToken: credentials.sessionToken,
                StartTime: data.startTime, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
                ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
            });
        };
        xhr.send();
    }
});

var taskId;

// 监听选文件
document.getElementById('file-selector').onchange = function () {

    var file = this.files[0];
    if (!file) return;

    // 上传文件
    cos.uploadFile({
        Bucket: Bucket,
        Region: Region,
        Key: file.name,
        Body: file,
        SliceSize: 1024 * 1024, // 大于1mb才进行分块上传
        onTaskReady: function (tid) {
          taskId = tid;
        },
        onProgress: function (progressData) {
            console.log('上传中', JSON.stringify(progressData));
        },
    }, function (err, data) {
        console.log(err, data);
    });

    // 可使用队列暂停、重启任务
    // cos.pauseTask(taskId);

};
</script>

webpack 引入方式

支持 webpack 打包的场景,可以用 npm 引入作为模块

npm i cos-js-sdk-v5 --save

Start Demo

1. git clone cos-js-sdk-v5 至本地
2. cd cos-js-sdk-v5 进入根目录后执行:npm install
3. 修改 server 文件夹中 sts.js 或 sts.php 中的 secretId、secretKey、bucket、region 配置;注意allowPrefix和allowActions需要设置适当的权限
4. 修改 demo/index.html 中config的Bucket、Region 参数
5. npm run server # 用 node 启动服务
6. 浏览器输入 http://127.0.0.1:3000/ 即可进行 demo 演示

说明文档

使用例子

快速入门

接口文档

cos-js-sdk-v5's People

Contributors

annexwu avatar carsonxu avatar ekxs0109 avatar galen-yip avatar godkite avatar haochuan9421 avatar itinysun avatar kinka avatar konakonall avatar livehigh avatar na57 avatar tianyong90 avatar tinnazhang avatar wonder233 avatar xueyunzhou1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cos-js-sdk-v5's Issues

引用出错

sdk uncaught third Error
Cannot read property 'userAgent' of undefined

headObject 没有返回自定义 Header

目前返回的 headers 只包含 cache-control content-type stag last-modified.
其他的诸如 Content-Dispositionx-cos-meta-* 都没在返回值里.

上传成功后如何获取图片地址

上传成功后返回值中的Location赋值给img并不能回显,在cos控制台中看到图片地址和Location的值不一致,请问该如何获取图片地址让图片回显

putObject上传的文件,在控制台点击文件链接下载下来,却无法预览,不知是什么问题,请教。

var File = document.getElementById('file');
File.onchange=function(){
for(var i=0; i<this.files.length;i++){
putObject(this.files[i].size,'pic/'+this.files[i].name,util.createFile(this.files[i]));
}
}

function putObject(key,blob) {
// 调用方法
cos.putObject({
Bucket: config.Bucket, /* 必须 /
Region: config.Region,
Key:key, /
必须 */
Body: blob,
TaskReady: function (tid) {
TaskId = tid;
},
onProgress: function (progressData) {
console.log('普通上传');
console.log(JSON.stringify(progressData.percent));
},
}, function (err, data) {
console.log(err || data);
});
}

通过post方式上传,如果文件名带中文报错

在实现web直传出错。
初步判断是获取密钥的时候文件名是通过URL编码的,但是COS验证的时候不知道用什么编码,官方文档没说,所以报403错误,尝试了几种解决方法都不行。

如何获取当前上传进度?

// 上传文件
var uploadFile = function (file, callback) {
var Key = 'dir/' + file.name; // 这里指定上传目录和文件名
getAuthorization({Method: 'PUT', Key: Key}, function (err, info) {
xxx
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xxx
xhr.onload = function () {
if (xhr.status === 200 || xhr.status === 206) {
var ETag = xhr.getResponseHeader('etag');
callback(null, {url: url, ETag: ETag});
} else {
callback('文件 ' + Key + ' 上传失败,状态码:' + xhr.status);
}
};
xhr.onerror = function () {
callback('文件 ' + Key + ' 上传失败,请检查是否没配置 CORS 跨域规则');
};
xhr.send(file);
});
};

想请问一下,上传文件如何获取当前上传进度,好做个进度条。查看了一下文档,暂未找到相关api。用搜索的xhr.upload.onprogress,获取的当前event.loaded(已传大小)直接和event.total(文件总大小)一样,就是进度直接100%了,然而看接口状态还是pending,依然还在传送中?

火狐360等浏览器报错

cos.sliceUploadFile({
        Bucket: Bucket,
        Region: Region,
        Key: file.name,
        Body: file,
        onHashProgress: function (progressData) {
            console.log('校验中', JSON.stringify(progressData));
        },
        onProgress: function (progressData) {
            console.log('上传中', JSON.stringify(progressData));
        },
    }, function (err, data) {
        console.log(err, data);
        //这里的data,360和火狐有时能获取到,有时获取不到
    });

data有时能获取到,有时获取不到

浏览器报错

XML 解析错误:找不到根元素

行 1,列 1: 播放@2x.png:1:1

TypeError: data is undefined

global is not define

///////////////////Here is my test code start///////////////////
const cos = require('cos-js-sdk-v5')
console.log(cos);
///////////////////Here is my test code end///////////////////

but I got a error

in utils .js

isBrowser:!!global.document // This is error code

when i download dist/**.min.js file

run it again

it is good

为何没有java的临时密钥auth

通过java sdk 可以快速的拿到临时密钥,也可以生产临时下载的url。
Java cos sdk怎么拿到sts_auth这样的结构?
这是php的。
qq 20180511203201

package.json配置错误

  "scripts": {
    "auth.js": "node server/auth.js",
  },

配置错了吧,应为

  "scripts": {
    "auth.js": "node server/sts-auth.js",
  },

vue 中使用,上传报错: cos is not defined

base.js?fbd3:1965 Uncaught ReferenceError: cos is not defined
at COS._submitRequest (base.js?fbd3:1965)
at eval (base.js?fbd3:1904)
at COS.getAuthorizationAsync (base.js?fbd3:1840)
at COS.submitRequest (base.js?fbd3:1864)
at COS.putObject (base.js?fbd3:940)
at COS.eval [as putObject] (util.js?c089:349)
at startNextTask (task.js?d062:56)
at eval (task.js?d062:173)
at Object.getFileSize (util.js?c089:458)
at COS.cos._addTask (task.js?d062:166)

此SDK支持IE9浏览器吗

文档中提到使用了HTML5的特性,由于没有查看源码不确定使用了哪些,SDK是否支持IE9浏览器?

谢谢.

Potential Code improvement and question about one line of code.

function getAuthorization (keys, method, pathname) {
var SecretId = keys.credentials.tmpSecretId;
var SecretKey = keys.credentials.tmpSecretKey;
// 整理参数
var query = {};
var headers = {};
method = (method ? method : 'get').toLowerCase();
pathname = pathname ? pathname : '/';
pathname.indexOf('/') === -1 && (pathname = '/' + pathname);

1. Potential improvement

Supporting reference

Node 6 and above now includes ES6 default parameters

Changes

  1. Initialize the parameters with the default parameters technique
  2. Also I found that in the following code, you haven't update/change the query and headers parameters, so I move them the parameters of this function.

Final version of the code block

function getAuthorization (keys, method='GET', pathname='/', query={}, headers={}) {
     var SecretId = keys.credentials.tmpSecretId; 
     var SecretKey = keys.credentials.tmpSecretKey; 
 
     pathname.indexOf('/') === -1 && (pathname = '/' + pathname); 
} 

2. Question about one line

pathname.indexOf('/') === -1 && (pathname = '/' + pathname);
I've tested the function withouth this line, it seems that this line is useless. I think it should be safe to remove this line.

3. General advices

你们代码不审核就提交上来?一大堆bug!

首先server的auth.php就两个bug,一个是末尾没有加上"?>",然后就是obj2str函数里$list创建数组不成功(至少php5.3是这样)!修改后
function obj2str($obj)
{

		$list = array(); ;
		$keyList = getObjectKeys($obj);
		$len = count($keyList);
		for ($i = 0; $i < $len; $i++) {
			$key = $keyList[$i];
			$val = isset($obj[$key]) ? $obj[$key] : '';
			$key = strtolower($key);
			$list[$i] = rawurlencode($key) . '=' . rawurlencode($val);
		}
		
		return implode('&', $list);
	}

关于这个sdk不同浏览器的问题

在本地测试,本人谷歌浏览器版本 71.0.3578.80(正式版本) (32 位)测试正常,放到线上运行后,也可以的。后来另外一个同事使用,他电脑 平时用360浏览器,使用上传时一直返回403,后来重新下载了个谷歌浏览器又可以用,就是360浏览器用不了,又找了一台电脑 ,电脑用的也是谷歌浏览器,版本不是最新的,也同样返回403,SignatureDoesNotMatchThe Signature you specified is invalid.,把谷歌浏览器升级到最新的版本,又能正常使用,请问这个问题怎么破。

你好,请教一个问题

你好,我现在遇到一个上传多张图片的问题,微信小程序 本地相册选择了8张图片, 应该调用哪个api 才能上传到腾讯云cos 中 ???

Body的校验在跨iframe的时候出错

在使用富文本编辑器ueditor进行开发的时候,需要使用sliceUploadFile进行上传。然后发现一个问题,因为ueditor进行上传的页面使用的是iframe的方式,所以如果使用最外层容器即top.COS进行上传的时候,虽然params.Body是属于File,但不属于top.File(即下面的global.File),所以导致抛出params.body error。

var getFileSize = function (api, params, callback) {
    var size;
    if (util.isBrowser) {
        if (typeof params.Body === 'string') {
            params.Body = new global.Blob([params.Body]);
        }
        if (params.Body instanceof global.File || params.Body instanceof global.Blob) {
            size = params.Body.size;
        } else {
            callback({error: 'params body format error, Only allow File|Blob|String.'});
            return;
        }
    }

我只能在每个iframe都引入文件包,并且对于ueditor使用js创建的iframe 也得补上js引用。。。
所以能否换个方式来校验prams.body(比如加上校验是否含有name,size属性之类,或者有一个自定义的校验方式?)。。

关于分片上传我这里有两个不明白的地方??

首先Authorization是一串这样的签名:q-sign-algorithm=sha1&q-ak=AKIDYw63nIGcR2PYTAosseCWcU9ZljTyJH5k&q-sign-time=1545045621;1545047481&q-key-time=1545045621;1545047481&q-header-list=host&q-url-param-list=&q-signature=a7e287c8fa1704c35fdb8cace9b2956ea6d056c4

这个官方提供的第一种方式:这个是向后台拿到临时密钥,在分片上传的时候(每一个请求)Authorization都是不一样的,我可以理解为每次请求的时候由这个包计算出来的。这种方式是可以走通的。
image

这个官方提供的第二种方式:问题就是这个第二种方式了,如果是在分片上传的情况下也是多个请求,但是签名就只会向后端拿取一次,签名也只能用一次(后面的请求就失效了)。所以如果是后端生成签名的方式的话,这种请求怎么处理。
2

webpack方式应用出错

在Vux项目里安装了cos-js-sdk-v5,先引用COS,然后实例化出错。

import { COS } from 'cos-js-sdk-v5'

const cos = new COS(...)

出错信息是:

Uncaught TypeError: E.COS is not a constructor

OPTIONS请求被拦截

前端Vue通过cos-js-sdk-v5构造之后发送请求,浏览器会先发出一个OPTIONS请求,然后返回403跨域被直接拦截,控制台也没有配置OPTIONS跨域的方式,这种要怎么处理,只能后端Java上传吗?
import COS from 'cos-js-sdk-v5'

this.cos = new COS({
getAuthorization: function (options, callback) {
vueHttp.getTmpSecret().then(res => {
callback({
TmpSecretId: res.data.secretId,
TmpSecretKey: res.data.secretKey,
XCosSecurityToken: res.data.sessionToken,
ExpiredTime: res.data.expiredTime
})
})
}
})

_this.cos.sliceUploadFile({
Bucket: _this.Bucket,
Region: _this.Region,
Key: item.cname,
Body: item
}, function (err, data) {
console.log(err, data)
})`

上传文件报错,官方文档没有错误code,有人解决吗?

文件上传成功,但报400错误错误码

MalformedPOSTRequest The body of your POST request is not well-formed multipart/form-data. token-up-1257006810.cos.ap-beijing.myqcloud.com NWI0OWJjMGVfZGIyOTVkNjRfMmI2Y18yZTRjMmU= OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTY4OGQ5OWY4YWFhNjAzOTkyNDJhZmQyOTk1YWVmOWFlNmRjYjM3OWQxODI2NjkxYTUyMWFhZDNhMGE4ZmQ3Yjk=

xhr.getResponseHeader('etag')无效的问题

demo/sts-put.html
文件里,有一行

var ETag = xhr.getResponseHeader('etag');

上传成功后,获取请求头里的etag值?但是,在使用过程中,浏览器一直提示

Refused to get unsafe header "etag"

请问这个该如何处理?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.