4

Я использую aws sdk javascript для загрузки файла в amazon s3.abort/stop amazon aws s3 upload, aws sdk javascript

код:

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. 

Спасибо за помощь.

ответ

4

Найдено раствор:

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

то для прерывания запроса:

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

Переключение на метод 'putObject' устраняет многопользовательскую магию загрузки, которая' s3.upload' под капотом. Любые загрузки, которые не выполняются, должны будут перезапускаться с самого начала с помощью 'putObject', с' s3.upload' он использует 'AWS.S3.MangaedUpload' под капотом и автоматически разбивает ваш файл и отправляет он по частям, позволяющий повторить попытку в середине файла. – AJB

1

Вы не можете связываться с bucket, который является вашим объектом S3, его необходимо вызывать для части загрузки.

изменить что-то вроде этого

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

так что вы можете связать на загрузку как

upload.abort.bind(upload); 

вы можете позвонить в методе тайм-аут, как коронован в example

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

спасибо, но я хочу остановить нажатие кнопки ... –

+0

вы можете позвонить отменить функцию onClick кнопки, ее штраф; Дело в том, что вы не можете вызывать прерывание из своей переменной bucket как свой экземпляр класса S3, и это не определено. поэтому вам нужно иметь объект из bucket.upload (...), на котором вы можете применить метод прерывания. –

+0

тоже попробовал ваше решение, но не работал :( –

0

Вызов прерывания() в среде браузера не будет прерывать любые запросы, которые уже в полете. Если была создана многостраничная загрузка, все части, которые еще не загружены, не будут отправлены, а многократная загрузка будет очищена.

Значение по умолчанию для размера элемента (5 * 1024 * 1024)

0

Через немой удачи я наткнулся на способ сделать это для многочастных загрузки. Принятый ответ заставляет вас использовать метод putObject, который не загружает и не отправляет их с помощью API многостраничной загрузки. Это следующее решение использует метод s3.upload AWS S3 SDK для Javascript в браузере. И, похоже, все работает отлично, хотя пример из официальной документации не работает.

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 не задокументировал это.