详细解答可以参考官方帮助文档
用户可以通过以下方式向OSS中上传文件:
以下示例代码中的catch语法,请自行学习下es6 promise、async/await。仔细阅读下sdk的使用方式,传送门。
通过put
接口来上传一个本地文件到OSS:
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function put () {
try {
let result = await client.put('object-key', 'local-file');
console.log(result);
} catch (e) {
console.log(er);
}
}
put();
通过putStream
接口来上传一个Stream中的内容,stream
参数可以是任何实现了Readable Stream
的对象,包含文件流,网络流等。当使用putStream
接口时,SDK默认会发起一个chunked encoding
的HTTP PUT请求。如果在options
指定了contentLength
参数,则不会使用chunked encoding
。
let OSS = require('ali-oss');
let fs = require('fs');
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function putStream () {
try {
// use 'chunked encoding'
let stream = fs.createReadStream('local-file');
let result = yield client.putStream('object-key', stream);
console.log(result);
// don't use 'chunked encoding'
let stream = fs.createReadStream('local-file');
let size = fs.statSync('local-file').size;
let result = await client.putStream(
'object-key', stream, {contentLength: size});
console.log(result);
} catch (e) {
console.log(e)
}
}
putStream();
用户也可以通过put
接口简单地将Buffer中的内容上传到OSS:
let OSS = require('ali-oss');
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function putBuffer () {
try {
let result = await client.put('object-key', new Buffer('hello world'));
console.log(result);
} catch (e) {
console.log(e);
}
}
putBuffer();
在需要上传的文件较大时,可以通过multipartUpload
接口进行分片上传。分片上传的好处是将一个大请求分成多个小请求来执行,这样当其中一些请求失败后,不需要重新上传整个文件,而只需要上传失败的分片就可以了。一般对于大于100MB的文件,建议采用分片上传的方法。
在使用multipartUpload接口如果遇到ConnectionTimeoutError
超时问题,业务方需要自己处理超时逻辑。如何处理超时,可以缩小分片大小、加大超时时间、重试请求,或者业务上捕获ConnectionTimeoutError
错误,然后给用户提示。
相关参数:
x-oss-meta-
Cache-Control: public, no-cache
Content-Disposition: somename
Content-Encoding: gzip
Expires: 3600000
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function multipartUpload () {
try {
let result = await client.multipartUpload('object-key', 'local-file', {
progress,
meta: {
year: 2017,
people: 'test'
}
});
console.log(result);
let head = await client.head('object-key');
console.log(head);
} catch (e) {
// 捕获超时异常
if (e.code === 'ConnectionTimeoutError') {
console.log("Woops,超时啦!");
// do ConnectionTimeoutError operation
}
console.log(e)
}
}
上面的progress
参数是一个进度回调函数,用于获取上传进度。progress
可以是一个async函数:
const progress = async function (p) {
console.log(p);
};
上面的meta
参数是一个用户自定义的元数据,通过head接口可以获取到object的meta数据。
分片上传提供progress
参数允许用户传递一个进度回调,在回调中SDK将当前已经上传成功的比例和断点信息作为参数。为了实现断点上传,可以在上传过程中保存断点信息(checkpoint),发生错误后,再将已保存的checkpoint作为参数传递给multipartUpload
,此时将从上次失败的地方继续上传。
let OSS = require('ali-oss');
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
let checkpoint;
async function resumeUpload() {
// retry 5 times
for (let i = 0; i < 5; i++) {
try {
const result = await client.multipartUpload('object-key', filePath, {
checkpoint,
async progress(percentage, cpt) {
checkpoint = cpt;
},
});
console.log(result);
break; // break if success
} catch (e) {
console.log(e);
}
}
}
resumeUpload();
上面的代码只是将checkpoint保存在变量中,如果程序崩溃的话就丢失了,用户也可以将它保存在文件中,然后在程序重启后将checkpoint信息从文件中读取出来。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。