【问题标题】:How to abort/stop an Amazon AWS s3 upload in progress如何中止/停止正在进行的 Amazon AWS s3 上传
【发布时间】:2016-03-29 13:13:09
【问题描述】:

我正在使用 javascript 版本的 aws sdk 将文件上传到 amazon s3 存储桶。

代码:

AWS.config.update({
                accessKeyId : 'access-key',
                secretAccessKey : 'secret-key'
            });
            AWS.config.region = 'region';
            var bucket = new AWS.S3({params: {Bucket: 'bucket-name'}});
            //var fileChooser = document.getElementById('file');
            var files = event.target.files;
            $.each(files, function(i, file){
            //console.log(file.name);
                if (file) {
                    var params = {Key: file.name, ContentType: file.type, Body: file};
                    bucket.upload(params).on('httpUploadProgress', function(evt) {
                        console.log("Uploaded :: " + parseInt((evt.loaded * 100) / evt.total)+'%');
                        if("Uploaded :: " + parseInt((evt.loaded * 100) / evt.total)+'%' == 'Uploaded :: 20%'){
                            console.log("abort upload");
                            bucket.abort.bind(bucket);
                        }
                    }).send(function(err, data) {
                        if(err != "null"){
                            console.log(data);
                            //alert("Upload Success \nETag:"+ data.ETag + "\nLocation:"+ data.Location);
                            var filename = data.Location.substr(data.Location.lastIndexOf("/")+1, data.Location.length-1);
                            console.log(filename);
                            fileData = filename;
                            filename = filename.replace("%20"," ");
                            $('.aws-file-content').append('<i id="delete-aws-file'+i+'" class="delete-aws-file icon-remove-sign"  data-filename=' + fileData +'></i><a href="'+data.Location+'" target=_blank >'+filename+'</a><br>');
                        }else{
                            console.log(err);
                        }
                    });
                }
            });

当文件成功上传部分文件并且仍在进行中时,我想中止/停止文件上传。

我试过了:

 bucket.abort();// not working
 bucket.abort.bind(bucket); //not working.

感谢您的帮助。

【问题讨论】:

    标签: javascript amazon-web-services file-upload amazon-s3 aws-sdk-js


    【解决方案1】:

    找到解决办法:

    // replaced bucket.upload() with bucket.putObject()
    var params = {Key: file.name, ContentType: file.type, Body: file};
    request = bucket.putObject(params);
    

    然后中止请求:

    abort: function(){
                request.abort();
            }
    

    【讨论】:

    • 切换到putObject 方法消除了s3.upload 在后台执行的分段上传魔法。任何失败的上传都需要使用putObject 从头开始​​重新启动,s3.upload 它在后台使用AWS.S3.MangaedUpload 并自动将您的文件分块并分部分发送,以允许中间文件重试。
    【解决方案2】:

    您不能从您的 S3 对象 bucket 绑定,必须为上传部分调用它。

    换成这样的

    var upload = bucket.upload(params)
    upload.send(....)
    

    所以你可以在上传时绑定

    upload.abort.bind(upload);
    

    您可以在example 中加冕的超时方法内调用

    // abort request in 1 second
    setTimeout(upload.abort.bind(upload), 1000);
    

    【讨论】:

    • 你可以从按钮的onClick函数中调用abort,很好;关键是你不能从你的存储桶变量中调用 abort 作为它的 S3 类的实例,这没有定义。所以你需要有一个来自 bucket.upload(...) 的对象,你可以在它上面应用 abort 方法
    【解决方案3】:

    在浏览器环境中调用 abort() 不会中止任何已经在运行的请求。如果创建了分段上传,则不会发送任何尚未上传的分段,并将清理分段上传。

    零件尺寸的默认值为 (5 * 1024 * 1024)

    【讨论】:

      【解决方案4】:

      运气不好,我偶然发现了一种用于分段上传的方法。

      接受的答案会强制您使用 putObject 方法,该方法不会分块上传并使用分段上传 API 发送它们。

      以下解决方案在浏览器中使用适用于 Javascript 的 AWS S3 开发工具包的 s3.upload 方法。即使官方文档中的示例不起作用,它似乎也可以正常工作。

      var bucket = new AWS.S3({params: {Bucket: 'bucket-name'}});
      var params = {Key: file.name, ContentType: file.type, Body: file};
      var bucket.upload(params).send();
      
      setTimeout(bucket.abort, 1000);
      

      就是这样。我刚试过打电话给bucket.abort(),它就奏效了。不知道为什么 AWS 没有记录这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 2012-11-07
        • 2022-08-20
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多