上传大对象时可以分成多个数据块(part)来分别上传,最后调用合并分片将上传的数据块合并为一个对象。
tos:PutObject
权限,详细信息,请参见权限配置指南。tos:AbortMultipartUpload
权限,详细信息,请参见权限配置指南。分片上传包含以下三个步骤:
说明
以下代码展示将本地文件通过分片的方式上传完整过程。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <button id="upload">上传</button> <input id="file" type="file" /> <!-- 导入 SDK 文件 --> <script src="https://tos-public.volccdn.com/obj/volc-tos-public/@volcengine/tos-sdk@latest/browser/tos.umd.production.min.js"></script> <script type="text/javascript"> const client = new TOS({ // yourRegion 填写 Bucket 所在地域。以华北2(北京)为例,yourRegion 填写为 cn-beijing。 region: yourRegion, // 填写 endpoint 名称。 endpoint: yourEndpoint, // 从 STS 服务获取的临时访问密钥(AccessKey ID 和 AccessKey Secret)。 accessKeyId: yourAccessKey, accessKeySecret: yourSecretKey, // 从 STS 服务获取的安全令牌(SecurityToken)。 stsToken: yourSecurityToken, // 填写 Bucket 名称。 bucket: examplebucket, }); // 监听按钮 const upload = document.getElementById('upload'); upload.addEventListener('click', async () => { const file = document.getElementById('file').files[0]; const name = 'exampledir/partUploadObject.txt'; let uploadId = null; try { const { data: { UploadId }, } = await client.createMultipartUpload({ key: name, }); uploadId = UploadId; // 每个 Part 的大小是 8M const PART_SIZE = 8 * 1024 * 1024; const uploadPartRes = []; // 串行上传每个 Part for (let i = 0; i * PART_SIZE < file.size; ++i) { const { data } = await client.uploadPart({ key: name, partNumber: i + 1, body: file.slice(i * PART_SIZE, Math.min((i + 1) * PART_SIZE, file.size)), uploadId: UploadId, }); uploadPartRes[i] = data.ETag; } await client.completeMultipartUpload({ key: name, parts: uploadPartRes.map((eTag, idx) => ({ eTag, partNumber: idx + 1, })), uploadId: UploadId, }); } catch (err) { console.log(err); if (uploadId) { // 出错后取消分片 await client.abortMultipartUpload({ key: name, uploadId, }); } } }); </script> </body> </html>
以下代码用于列举指定存储桶中指定对象已上传的分片信息。
// 导入 SDK <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <button id="upload">上传</button> <input id="file" type="file" /> <!-- 导入 SDK 文件 --> <script src="https://tos-public.volccdn.com/obj/volc-tos-public/@volcengine/tos-sdk@latest/browser/tos.umd.production.min.js"></script> <script type="text/javascript"> const client = new TOS({ // yourRegion 填写 Bucket 所在地域。以华北2(北京)为例,yourRegion 填写为 cn-beijing。 region: yourRegion, // 填写 endpoint 名称。 endpoint: yourEndpoint, // 从 STS 服务获取的临时访问密钥(AccessKey ID 和 AccessKey Secret)。 accessKeyId: yourAccessKey, accessKeySecret: yourSecretKey, // 从 STS 服务获取的安全令牌(SecurityToken)。 stsToken: yourSecurityToken, // 填写 Bucket 名称。 bucket: examplebucket, }); const bucketName = 'browser-sdk-test-bucket'; const objectName = 'exampledir/partUploadObject.txt'; // 分片上传任务 ID,可以从 createMultipartUpload 接口获取 const uploadId = `65b597dc7eca47bcb99f01647431bd15`; // 列举已上传分片 const {data} = await client.listParts({ bucket: bucketName, key: objectName, uploadId, }); console.log('result data:', data); </script> </body> </html>
您可以通过 abortMultipartUpload 方法来取消分片上传任务。当一个分片任务被取消后, TOS 会将已上传的分片数据删除,同时您无法再对此分片任务进行任何操作。以下代码用于取消分片上传任务。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <button id="upload">上传</button> <input id="file" type="file" /> <!-- 导入 SDK 文件 --> <script src="https://tos-public.volccdn.com/obj/volc-tos-public/@volcengine/tos-sdk@latest/browser/tos.umd.production.min.js"></script> <script type="text/javascript"> const client = new TOS({ // yourRegion 填写 Bucket 所在地域。以华北2(北京)为例,yourRegion 填写为 cn-beijing。 region: yourRegion, // 填写 endpoint 名称。 endpoint: yourEndpoint, // 从 STS 服务获取的临时访问密钥(AccessKey ID 和 AccessKey Secret)。 accessKeyId: yourAccessKey, accessKeySecret: yourSecretKey, // 从 STS 服务获取的安全令牌(SecurityToken)。 stsToken: yourSecurityToken, // 填写 Bucket 名称。 bucket: examplebucket, }); const bucketName = 'browser-sdk-test-bucket'; const objectName = 'exampledir/partUploadObject.txt'; // 分片上传任务 ID,可以从 createMultipartUpload 接口获取 const uploadId = `65b597dc7eca47bcb99f01647431bd15`; // 列举已上传分片 const {data} = await client.abortMultipartUpload({ bucket: bucketName, key: objectName, uploadId, }); console.log('result data:', data); </script> </body> </html>