Загрузка файла в Safari, а затем обновление страницы - PullRequest
0 голосов
/ 04 марта 2019

У меня проблема с JavaScript, который не работает так, как я ожидаю в Safari.Все работает, как и ожидалось в IE 11, Edge, Chrome и Firefox.Safari - единственный причудливый.

Мой пример использования следующий:

  • Пользователю должен быть предоставлен файл для загрузки
  • Может потребоваться сервернекоторое время для создания файла
  • Сервер отправляет файл с заголовком Content-Disposition и соответствующим типом MIME
  • . Пользователь должен быть перенаправлен на другую страницу после загрузки файла
  • Предпочтительно я не хочу менять серверную часть

Мое текущее решение выглядит следующим образом:

<button id="btn1" onClick="send(this, 'testfile');">Download</button>
<script>
  console.log("Loading page");
  var oReq = new XMLHttpRequest();

  oReq.onload = function(oEvent) {
    console.log(this)
    var header = oReq.getResponseHeader('Content-Disposition')
    if(header === null) {
      // do some error handling here...
    } else {
      var startIndex = header.indexOf("filename=") + 10; // Adjust '+ 10' if filename is not the right one.
      var endIndex = header.length - 1; //Check if '- 1' is necessary
      var filename = header.substring(startIndex, endIndex);
      var blob = this.response;
      var blobUrl = window.URL.createObjectURL(new Blob([blob], {type: blob.type}));
      var a = document.createElement("a");
      var currentLoc = window.location
      if(a.download !== undefined){
        // works in Chrome and Firefox
        console.log(blob);
        document.body.appendChild(a);
        a.style = "display: none";
        a.href = blobUrl;
        a.download = filename ;
        a.onclick = function() {
          window.location = currentLoc;
        };
        a.click();
      } else if(navigator.msSaveBlob !== undefined) {
        // Works in IE
        navigator.msSaveBlob(blob, filename);
        window.location = currentLock;
      }
    }
  };

  function send(btn, fil) {
    btn.disabled = true
    oReq.open("GET", "/"+fil, true);
    oReq.responseType = "blob";
    console.log("Clicked button!")
    oReq.send()
  }
</script>

Первая проблема, с которой я столкнулся, заключалась в том, что Safari вообще не загружал файл,Я исправил это, отложив перенаправление страницы на событие onclick привязки загрузки.Однако теперь Safari отказывается от перенаправления.Я могу это исправить, добавив setTimeout вокруг перенаправления, но я хотел бы понять, почему это происходит, и избежать setTimeout.

Тайм-ауты имеют тенденцию работать, пока они по какой-то причине не установлены слишком низкими и, следовательно, неРабота.Поэтому я стараюсь, чтобы избежать их, если это возможно.

1023 * Кто-нибудь есть какие-либо идеи, почему Safari упорно отказывается обрабатывать задание местоположения, а все остальные браузеры действуют хорошо?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...