
16.09.2020, 22:56
|
Профессор
|
|
Регистрация: 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.
|
|

16.09.2020, 23:34
|
 |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
какого типа значение в data?
Последний раз редактировалось Alexandroppolus, 16.09.2020 в 23:38.
|
|

16.09.2020, 23:37
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Бинарные данные в обоих случаях.
PS. Я пробовал и строкой, то есть, считывал файл в строку (file_get_contents) и отдавал, c html норма, с zip проблема. Что еще интересно - имя файла переданное сервером как name.html так и сохраняется, а вот zip сохраняется как name.zip.zip.
Последний раз редактировалось laimas, 16.09.2020 в 23:44.
|
|

16.09.2020, 23:38
|
 |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
если revokeObjectURL убрать, проблема остается?
|
|

16.09.2020, 23:45
|
 |
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
|
|

16.09.2020, 23:56
|
 |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
laimas,
кстати, а зачем такая трехходовочка: загрузить бинарные данные, сотворить блоб, толкнуть его в ссылку?
почему нельзя сразу дать ссылку на формирователь архива? ну или хотя бы аяксом загрузить готовый блоб, который сохранить?
|
|

17.09.2020, 00:04
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Alexandroppolus
|
если revokeObjectURL убрать, проблема остается?
|
Да.
Сообщение от Alexandroppolus
|
почему нельзя сразу дать ссылку на формирователь архива?
|
Не могу я иначе, это в контексте уже имеющегося, там все диалоги асинхронные, и при обращении к этому контроллеру файл создается как временный, который сразу же по окончанию диалога удаляется.
|
|

17.09.2020, 00:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
В общем причина в браузере, то есть в политике безопасности надо полагать.
Загружаем файл, выбираем сохранить, сохраняем, размер нулевой. Открываем панель загрузок, в ней нужно разрешить загрузку, браузер пишите файл на диск, и теперь все ОК. Если в диалоге выбрать не сохранение, а открытие файла, то он без проблем сохраняется во временной папке системы.
Такая хреь в FF, в других нормально.
Последний раз редактировалось laimas, 17.09.2020 в 01:00.
|
|

17.09.2020, 08:13
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,762
|
|
У меня сохранялка нормально везде работает
Но я всегда указываю типы (на всякий пожарный)
Попробуйте
var blob = new Blob([data], {type: 'application/zip'})
и
a.type = 'application/zip'
|
|

17.09.2020, 10:35
|
Профессор
|
|
Регистрация: 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_, в других не проверял как они поступают. Если имя формировать на клиенте, то нормально, но это не совсем гут, как-то бы побороть это.
|
|
|
|