Javascript 如何中止/停止正在进行的Amazon AWS s3上载
我正在使用aws sdk的javascript版本将文件上载到AmazonS3存储桶 代码: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.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);