В нашем приложении Ruby on Rails есть действие контроллера, которое отправляет ZIP:
send_data File.read(zip_pathname), filename: zip_filename, type: 'application/zip'
. Мы делаем это загружаемым, используя атрибут загрузки по ссылке, например:
<%= link_to zip_download_path(@object), download: zip_filename do %>
<i class="fas fa-download fa-fw"></i> Download ZIP
<% end %>
Работает нормально, но может занять до 5-6 секунд, прежде чем что-либо произойдет (из-за размера ZIP)
Чтобы пользователь не нажимал ссылку снова и показывал, что что-то происходит, мы пытались загрузить загрузку, используя AJAX, а затем превратить ее в BLOB-объект и использовать FileReader для ее загрузки:
const reader = new FileReader();
reader.onload = function(e) {
const anchor = document.createElement('a');
anchor.style.display = 'none';
anchor.href = e.target.result;
anchor.download = 'download';
anchor.click();
hideLoading();
}
$('[download]').on('click', function (e) {
e.preventDefault();
showLoading();
var download = $(this);
$.get(download.attr('href'), function (data) {
const blob = new Blob([data], { name: download.attr('download'), type: 'application/zip' });
reader.readAsDataURL(blob);
});
});
Это успешно показывает экран загрузки, а затем загружает ZIP и снова скрывает экран загрузки, за исключением что ZIP возвращается как ошибка загрузки, а не как настоящий ZIP, как раньше ... может показаться, что преобразование ZIP в BLOB-объект происходит там, где происходит сбой ...
Возможно ли преобразовать ZIP в Blob? И есть ли что-то не так в приведенном выше коде?
Глядя на: e.target.result
содержимое:
data:application/zip;base64,...
Таким образом, похоже, что он успешно создал данные ... однако, когда я пытаюсь открыть это в окне браузера, он ничего не показывает ...