开发者社区 问答 正文

使用js sdk进行多文件上传报错

我根据阿里云js sdk的demo做了一个上传功能,使用原生的file input多文件上传,第一个文件上传成功,到第二个文件上传的时候报错:
Error: The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.
    at o.<anonymous> (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:4:18257)
    at n (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:806)
    at Generator._invoke (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:1851)
    at Generator.e.(anonymous function) [as next] (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:985)
    at n (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:806)
    at l (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:2283)
    at Generator._invoke (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:1628)
    at Generator.e.(anonymous function) [as next] (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:12:985)
    at a (http://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.1.min.js:6:28350)
    at <anonymous>


我的js功能代码:
function uploadFile(client) {
    var file = document.getElementById('file').files[1];
    var key = folder + file.name;
    console.log(file.name + ' => ' + key);
    return client.multipartUpload(key, file, {
        checkpoint: checkpoint,
        progress: progressFunc
    }).catch(function (err) {
        console.log(err);
    }).then(function (res) {
        console.log('upload success: %j', res);
    });
}


请问有没有人知道怎么在js sdk重置这个upload id?

展开
收起
sw_wy 2017-10-26 10:59:36 3477 分享 版权
阿里云 AI 助理回答

遇到您描述的错误“Error: The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.”,通常意味着尝试使用一个无效或已失效的上传ID进行分片上传操作。在连续上传多个文件时,每个文件应当初始化其独立的上传ID。从您的代码片段来看,问题可能出在未为每个文件单独初始化分片上传或是复用了首个文件的上传ID。

解决方案

确保对每个上传的文件执行以下步骤:

  1. 初始化分片上传:对于每个文件,都需要调用initiateMultipartUpload方法来获取一个新的、独立的uploadId。这意味着您需要在循环处理每个文件之前或内部执行此操作。

    async function initiateUpload(client, key) {
       try {
           const result = await client.initiateMultipartUpload('yourBucketName', key);
           return result.uploadId; // 返回新的uploadId用于后续的分片上传
       } catch (err) {
           console.error('Initiate multipart upload failed:', err);
           throw err;
       }
    }
    
  2. 修改上传逻辑:在您的uploadFile函数中,应该先为当前文件调用上述的initiateUpload函数以获取新的uploadId,然后再进行分片上传。

    async function uploadFile(client) {
       var file = document.getElementById('file').files[0]; // 确保这里根据实际需求选择文件
       var key = folder + file.name;
       console.log(file.name + ' => ' + key);
    
       // 初始化分片上传并获取uploadId
       let uploadId = await initiateUpload(client, key);
    
       try {
           // 使用新获取的uploadId进行分片上传
           const res = await client.multipartUpload(key, file, {
               checkpoint: checkpoint,
               progress: progressFunc,
               uploadId: uploadId // 添加此参数
           });
           console.log('upload success: %j', res);
       } catch (err) {
           console.error('Upload failed:', err);
       }
    }
    
  3. 注意事项

    • 确保每次调用multipartUpload时都携带了对应文件的新鲜uploadId
    • 如果有使用到checkpoint进行断点续传,请注意每个文件的checkpoint信息也是独立的,不应混淆。

通过以上调整,可以确保每个文件都有自己的上传流程,避免了上传ID复用导致的错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答