Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.09.2020, 22:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Загрузка файла
Загружается:

var blob = new Blob([data]),
    file = request.getResponseHeader('filename'),
    url = URL.createObjectURL(blob),
    a = document.createElement('a');
    a.href = url;
    a.download = file;
    a.click();
    URL.revokeObjectURL(url);


На сервере из двух строковых значений (это html, результат работы шаблонизатора) готовится zip архив, с двумя файлами в нем, который и отдается клиенту.
Архив создается, на сервере он не имеет проблем, то есть, его можно открыть, извлечь из него файлы ...
Но на клиенте он сохраняется с нулевым размером. При этом, если посмотреть возвращаемые данные (data), то это содержимое архива.
А если, к примеру, вместо архива отдать любую из строк (html), то сохранение происходит нормально.

В чем прикол?

Последний раз редактировалось laimas, 16.09.2020 в 23:08.
Ответить с цитированием
  #2 (permalink)  
Старый 16.09.2020, 23:34
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

какого типа значение в data?

Последний раз редактировалось Alexandroppolus, 16.09.2020 в 23:38.
Ответить с цитированием
  #3 (permalink)  
Старый 16.09.2020, 23:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Бинарные данные в обоих случаях.

PS. Я пробовал и строкой, то есть, считывал файл в строку (file_get_contents) и отдавал, c html норма, с zip проблема. Что еще интересно - имя файла переданное сервером как name.html так и сохраняется, а вот zip сохраняется как name.zip.zip.

Последний раз редактировалось laimas, 16.09.2020 в 23:44.
Ответить с цитированием
  #4 (permalink)  
Старый 16.09.2020, 23:38
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

если revokeObjectURL убрать, проблема остается?
Ответить с цитированием
  #5 (permalink)  
Старый 16.09.2020, 23:45
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

можно попробовать
https://github.com/eligrey/FileSaver.js
Ответить с цитированием
  #6 (permalink)  
Старый 16.09.2020, 23:56
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

laimas,
кстати, а зачем такая трехходовочка: загрузить бинарные данные, сотворить блоб, толкнуть его в ссылку?
почему нельзя сразу дать ссылку на формирователь архива? ну или хотя бы аяксом загрузить готовый блоб, который сохранить?
Ответить с цитированием
  #7 (permalink)  
Старый 17.09.2020, 00:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Alexandroppolus
если revokeObjectURL убрать, проблема остается?
Да.

Сообщение от Alexandroppolus
почему нельзя сразу дать ссылку на формирователь архива?
Не могу я иначе, это в контексте уже имеющегося, там все диалоги асинхронные, и при обращении к этому контроллеру файл создается как временный, который сразу же по окончанию диалога удаляется.
Ответить с цитированием
  #8 (permalink)  
Старый 17.09.2020, 00:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

В общем причина в браузере, то есть в политике безопасности надо полагать.
Загружаем файл, выбираем сохранить, сохраняем, размер нулевой. Открываем панель загрузок, в ней нужно разрешить загрузку, браузер пишите файл на диск, и теперь все ОК. Если в диалоге выбрать не сохранение, а открытие файла, то он без проблем сохраняется во временной папке системы.

Такая хреь в FF, в других нормально.

Последний раз редактировалось laimas, 17.09.2020 в 01:00.
Ответить с цитированием
  #9 (permalink)  
Старый 17.09.2020, 08:13
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,762

У меня сохранялка нормально везде работает
Но я всегда указываю типы (на всякий пожарный)

Попробуйте
var blob = new Blob([data], {type: 'application/zip'})
и
a.type = 'application/zip'
Ответить с цитированием
  #10 (permalink)  
Старый 17.09.2020, 10:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от voraa
У меня сохранялка нормально везде работает
В FF будет предупреждение на загружаемые файлы типа exe, zip еще чего-то там, то есть в тех которых могут быть червяки или макросы. Это можно отключить, сняв флажок с "Предупреждать о нежелательных и редко загружаемых программах" в настройках безопасности и приватности.

Сообщение от voraa
Попробуйте
var blob = new Blob([data], {type: 'application/zip'})
Это конечно замечательно, но через каку. По идее тип, имя файла, это все должен задавать сервер, а не в js сценарий по каждому случаю прописывать. Но если я беру имя из заголовка ответа и использую его, то FF как раз и именует файл как name.zip.zip, Опера как _name.zip_, в других не проверял как они поступают. Если имя формировать на клиенте, то нормально, но это не совсем гут, как-то бы побороть это.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
window.download и "необычная" загрузка файла iNfantry Events/DOM/Window 4 14.10.2016 15:08
Ajax и загрузка файла клиенту alexgluker jQuery 2 08.09.2015 15:30
загрузка файла oleg666 jQuery 1 30.06.2011 17:57
Загрузка файла и JavaScript DDestroy Events/DOM/Window 8 04.02.2011 12:28
Не работает корректно загрузка файла в IE rroman Javascript под браузер 0 08.10.2010 19:12