Загрузка blob createObjectURL не работает в Chrome
Код ниже показывает ошибку "файл не найден" в Chrome, но тот же код работает в некоторых других средах в Chrome, и после добавления некоторой задержки он работал.
Пожалуйста, сообщите причину необходимой задержки по времени в моем районе.
var a = document.createElement('a');
a.style = "display: none";
var blob = new Blob(data, {type: "application/octet-stream"});
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
2 ответа
Отзыв URI blob: // - это синхронная операция, а загрузка файла - нет.
Несмотря на то, что данные могут быть в памяти и, следовательно, загружены очень быстро, это не всегда так. Данные Blob могут даже не находиться в одном месте, например, некоторые blobParts могут находиться в памяти, некоторые - на диске пользователя или даже в общей папке, доступ к которой осуществляется через сеть. Также простой запрос доступа к ОС для записи может быть выполнен асинхронно.
Итак, к тому времени, когда вы позвоните revokeObjectURL
, у браузера, возможно, еще не было времени для записи вашего файла на диск, и когда он пытается это сделать или получить доступ к новому объекту blobPart, по указанному адресу больше нет доступных указателей.
К сожалению, нет события, сообщающего нам, когда эта запись на диск будет выполнена, по крайней мере, до тех пор, пока API собственной файловой системы не станет официальным, поэтому лучшее, что мы можем сделать на данный момент, - это подождать изрядное количество времени, прежде чем отозвать большой двоичный объект.:// URI.
Для справки, FileSaver.js ждет 40 секунд.
Я добавил время ожидания, как показано ниже, теперь он работает нормально
setTimeout(функция (){ window.URL.revokeObjectURL(url); }, 3000);