Вы когда-нибудь задумывались, как отслеживать точный ход загрузки файла при загрузке на стороне клиента в Amazon S3? На самом деле это относительно простая задача. Это хорошо работает с любым типом загрузки файлов. Если вы еще не настроили загрузку файлов на S3, ознакомьтесь с этой статьей — Загрузка файлов из браузера на Amazon S3 с помощью Node.js.

При отправке запроса PUT в Amazon S3 для загрузки нашего файла мы будем использовать класс XMLHttpRequest.

var s3SignedUploadUrl = "...";
var file = document.getElementById("file-input").files[0];
var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log("UPLOAD SUCCESSFUL");
    }
    else {
      console.log("UPLOAD FAILED");
    }
  }
};

xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      var percentComplete = (e.loaded / file.size) * 100;
    }
};

xhr.open("PUT", s3SignedUploadUrl);
xhr.send(file);

Использование промисов

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

function uploadS3(url, file, progressCallback) {
  return new Promise(function (resolve, reject) {

    const xhr = new XMLHttpRequest();

    xhr.onreadystatechange = () => {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(xhr)
        }
        else {
          reject(xhr)
        }
      }
    };

    if (progressCallback) {
      xhr.upload.onprogress = (e) => {
        if (e.lengthComputable) {
          var percentComplete = (e.loaded / file.size) * 100;
          progressCallback(percentComplete);
        }
      };
    }

    xhr.open("PUT", url);
    xhr.send(file);
  });
}

Теперь вы можете использовать его намного проще, и даже лучше, если вы используете асинхронность и ожидание.

var s3SignedUploadUrl = "...";
var file = document.getElementById("file-input").files[0];

// USE PROMISE
uploadS3(s3SignedUploadUrl, file, function(percent) { console.log(percent); })
  .then(function() {})
  .catch(function() {})

// USE ASYNC / AWAIT
(async () => {
  await uploadS3(s3SignedUploadUrl, file, function(percent) { 
    console.log(percent); 
  })
})();

Предоставлено вам Uploadbtn. Самый простой способ загрузить файлы на Amazon S3 без сервера. Начните загружать файлы всего за 5 минут

Первоначально опубликовано на www.uploadbtn.com.