Javascript 如何中止/停止正在进行的Amazon AWS s3上载

Javascript 如何中止/停止正在进行的Amazon AWS s3上载,javascript,amazon-web-services,file-upload,amazon-s3,aws-sdk-js,Javascript,Amazon Web Services,File Upload,Amazon S3,Aws Sdk Js,我正在使用aws sdk的javascript版本将文件上载到AmazonS3存储桶 代码: AWS.config.update({ accessKeyId : 'access-key', secretAccessKey : 'secret-key' }); AWS.config.region = 'region'; var bucket = new AWS.S

我正在使用aws sdk的javascript版本将文件上载到AmazonS3存储桶

代码:

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);
                        }
                    });
                }
            });

谢谢您的帮助。

您无法从S3对象的
bucket进行绑定,上传部分必须调用它

换成这样的东西

var upload = bucket.upload(params)
upload.send(....)
所以你可以像这样在上传时绑定

upload.abort.bind(upload);
您可以在超时方法内调用

找到解决方案:

// replaced bucket.upload() with bucket.putObject()
var params = {Key: file.name, ContentType: file.type, Body: file};
request = bucket.putObject(params);
然后,对于中止请求:

abort: function(){
            request.abort();
        }
在浏览器环境中调用abort()不会中止任何已在运行中的请求。如果创建了多部分上载,则不会发送任何尚未上载的部分,并且将清理多部分上载


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

由于运气不好,我偶然发现了一种多部分上传的方法

接受的答案迫使您使用
putObject
方法,该方法不分块上传,而是使用多部分上传API发送上传

以下解决方案使用浏览器中AWS s3 SDK for Javascript的
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没有记录这一点。

您可以从按钮的onClick函数调用abort,这很好;关键是,您不能将bucket变量作为S3类的实例调用abort,这是没有定义的。因此,您需要从bucket.upload(…)中获得一个对象,您可以在该对象上应用中止方法切换到
putObject
方法消除了
s3.upload
在引擎盖下实现的多部分上传魔法。任何失败的上传都需要使用
putObject
s3从一开始就重新启动。upload
在引擎盖下使用
AWS.s3.MangaedUpload
,自动将文件分块发送,以允许中间文件重试。
abort: function(){
            request.abort();
        }
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);