本文主要介绍Browser.js SDK中的常见问题与解决方法。
如何调用STS
浏览器是不受信任的环境,如果把AccessKey ID和AccessKey Secret直接保存在浏览器端,存在极高的风险。建议在浏览器环境下使用STS模式进行OSS接口调用。
浏览器中使用STS Server相关文档。
获取STS token后,就可进行SDK初始化操作。
<script type="text/javascript"> $.ajax("http://your_sts_server/",{method: 'GET'},function (err, result) { let client = new OSS({ accessKeyId: result.AccessKeyId, accessKeySecret: result.AccessKeySecret, stsToken: result.SecurityToken, endpoint: '<oss endpoint>', bucket: '<Your bucket name>' }); }); </script>
如何开启HTTPS访问
初始化SDK时,可传入以下几个参数:
- region:指您申请OSS服务时的区域,例如
oss-cn-hangzhou
。完整的区域列表可以在OSS服务节点查看。 - internal:配合
region
使用,如果指定internal
为true
,则访问内网节点。 - secure:配合
region
使用,如果指定了secure
为true
,则使用HTTPS访问。const client = new OSS({ region, accessKeyId: creds.AccessKeyId, accessKeySecret: creds.AccessKeySecret, stsToken: creds.SecurityToken, bucket, secure:true });
- endpoint:例如
http://oss-cn-hangzhou.aliyuncs.com
,如果指定了endpoint
,则region
会被忽略,endpoint
可以指定HTTPS,也可以是IP形式。
浏览器跨域问题如何解决
在浏览器中使用SDK前,先要设置Bucket的CORS属性。具体操作,请参见相关文档。
如何设置上传文件的用户自定义数据(meta)、文件类型(mime)和请求头(header)
请参见浏览器分片上传。
关于浏览器端断点续传的说明
可以将checkpoint保存到浏览器的localstorage,下次再调用的时候传入checkpoint参数,就可以实现断点续传功能。
如何上传文件到指定目录
给要上传的Object名称前加指定目录前缀即可。更多信息,请参见OSS和文件系统对比。
let OSS = require('ali-oss') let client = new OSS({ region: '<Your region>', accessKeyId: '<Your AccessKeyId>', accessKeySecret: '<Your AccessKeySecret>', bucket: 'Your bucket name' }); client.multipartUpload('base-dir/' +'object-key', 'local-file', { progress: async function (p) { console.log('Progress: ' + p); } }); console.log(result); }).catch((err) => { console.log(err); });
如何上传base64编码的图片
base64先转码成指定格式图片,然后调用OSS上传接口进行上传。更多信息,请参见Github示例。
/** * base64 to file * @param dataurl base64 content * @param filename set up a meaningful suffix, or you can set mime type in options * @returns {File|*} */ const dataURLtoFile = function dataURLtoFile(dataurl, filename) { const arr = dataurl.split(','); const mime = arr[0].match(/:(.*?);/)[1]; const bstr = atob(arr[1]); let n = bstr.length; const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime });// if env support File, also can use this: return new File([u8arr], filename, { type: mime }); }; // client表示OSS client实例 const uploadBase64Img = function uploadBase64Img(client) { // base64格式的内容 const base64Content = 'data:image:xxxxxxxxxxxxx'; const filename = 'img.png'; const imgfile = dataURLtoFile(base64Content, filename); //key表示上传的object key ,imgFile表示dataURLtoFile处理后返回的图片 client.multipartUpload(key, imgfile).then((res) => { console.log('upload success: %j', res); }).catch((err) => { console.error(err); }); };
如何限制上传文件的大小
在浏览器中可以根据document.getElementById(“file”).files[0].size获取上传文件的大小(字节数)。更多信息,请参见Web端直传实践的post请求。
如何获取上传进度
使用分片上传时,可获取上传进度。
如何获取下载进度
浏览器中无法获取进度,可调用signatureUrl
方法,获取下载地址。更多信息,请参见相关文档。
如何获取Object的签名URL
可调用signatureUrl
方法,获取下载地址。更多信息,请参见相关文档。
如何使用SDK生成的签名URL并进行资源上传
签名URL常用于授权给第三方进行资源的下载和上传操作。下载请参见上一条。SDK中提供signatureUrl API,用于返回一个经过签名的URL,用户直接使用该URL上传或者下载资源即可。利用签名URL上传资源请参见SDK工程示例签名URL上传资源示例。
如何使用表单上传方式上传资源到OSS服务器
请参见Web端直传实践。
如何运行示例工程
进入ali-oss/example执行 npm run start
。
如何添加上传回调
const uploadFile = function uploadFile(client) { if (!uploadFileClient || Object.keys(uploadFileClient).length === 0) { uploadFileClient = client; } const file = document.getElementById('file').files[0]; const key = document.getElementById('object-key-file').value.trim() || 'object'; console.log(`${file.name} => ${key}`); const options = { progress, partSize: 500 * 1024, timeout:60000, meta: { year: 2017, people: 'test', }, callback: { //此处是添加上传回调的位置。 url: 'https://uploadtest.xueersi.com/v2/sync', /* host: 'oss-cn-shenzhen.aliyuncs.com', */ /* eslint no-template-curly-in-string: [0] */ body: 'bucket=${bucket}&object=${object}&var1=${x:var1}', contentType: 'application/x-www-form-urlencoded', customValue: { var1: 'value1', var2: 'value2', }, },
关于上传回调的更多信息,请参见原理介绍。