您可以通过简单上传或分片上传的方式将文件或数据上传到OSS。
简单上传
您可以通过简单上传(即putObject方式)将File对象、Blob数据以及OSS Buffer上传到OSS。
Blob(Binary Large Object)代表二进制类型的大对象。
let OSS = require('ali-oss');
let client = new OSS({
// region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
region: '<Your region>',
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
// 支持File对象、Blob数据以及OSS Buffer。
const data = '<File Object>';
// or const data = new Blob('content');
// or const data = new OSS.Buffer('content'));
async function putObject () {
try {
// object-key可以自定义为文件名(例如file.txt)或目录(例如abc/test/file.txt)的形式,实现将文件上传至当前Bucket或Bucket下的指定目录。
let result = await client.put('object-key', data);
console.log(result);
} catch (e) {
console.log(e);
}
}
putObject();
分片上传
当需要上传的文件较大时,可以通过MultipartUpload接口进行分片上传。分片上传是指将要上传的文件分成多个数据块(Part)来分别上传。当其中一些分片上传失败后,OSS将保留上传进度记录,再次重传时只需要上传失败的分片,而不需要重新上传整个文件。一般大于100 MB的文件,建议采用分片上传的方法,通过断点续传和重试,提高上传成功率。
在使用MultipartUpload接口时,如果遇到ConnectionTimeoutError
超时问题,业务方需自行处理超时逻辑。例如通过缩小分片大小、加大超时时间、重试请求或者捕获ConnectionTimeoutError
错误等方法处理超时,详情请参见网络错误处理。
说明
- checkpoint参数用于记录上传进度,断点续传上传时将记录的checkpoint参数传入即可。
- 每次进行分片上传时建议使用一个新的OSS实例。
- 相关参数说明请参见GitHub。
以下代码用于断点续传上传:
let OSS = require('ali-oss')
let ossConfig = {
// region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
region: '<Your region>',
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
}
let client = new OSS(ossConfig);
let tempCheckpoint;
// 定义上传方法。
async function multipartUpload () {
try {
// object-key可以自定义为文件名(例如file.txt)或目录(例如abc/test/file.txt)的形式,实现将文件上传至当前Bucket或Bucket下的指定目录。
let result = await client.multipartUpload('object-key', 'file-object', {
progress: function (p, checkpoint) {
// 断点记录点。浏览器重启后无法直接继续上传,您需要手动触发上传操作。
tempCheckpoint = checkpoint;
},
meta: { year: 2020, people: 'test' },
mime: 'image/jpeg'
})
} catch(e){
console.log(e);
}
}
// 开始分片上传。
multipartUpload();
// 暂停分片上传。
client.cancel();
// 恢复上传。
let resumeclient = new OSS(ossConfig);
async function resumeUpload () {
try {
let result = await resumeclient.multipartUpload('object-key', 'file-object', {
progress: function (p, checkpoint) {
tempCheckpoint = checkpoint;
},
checkpoint: tempCheckpoint,
meta: { year: 2020, people: 'test' },
mime: 'image/jpeg'
})
} catch (e) {
console.log(e);
}
}
resumeUpload();
- progress参数是进度回调函数,用于获取上传进度。
const progress = function progress(p, checkpoint) { console.log(p) };
- meta参数是用户自定义的元数据,通过head接口可以获取到Object的元数据。同时,您需要在OSS控制台基础设置页签下的跨域设置中设置暴露header,详情请参见设置跨域访问。
请求成功后的返回结果如下:
- 在options参数中添加
callback
即可实现上传回调通知,代码如下:callback: { url: 'http://oss-demo.aliyuncs.com:23450', host: 'oss-cn-hangzhou.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', }, },
在文档使用中是否遇到以下问题
更多建议
匿名提交