Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 17.09.2020, 11:29
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от laimas
По идее тип, имя файла, это все должен задавать сервер
это да, но ведь у нас ajax
и нам плевать на заголовки headers
нам нужно только бинарное тело, таким образом мы имеем возможность задать и имя файла и его тип, какие нам угодно
я привел библиотеку выше, плюсы ее использования в широком охвате браузеров, небольшая по размеру. Работает и в FF под разными системами, количество звезд говорит о ее полезности, сам использовал когда жаловались на баги пользователи
Ответить с цитированием
  #12 (permalink)  
Старый 17.09.2020, 11:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Да нафик она нужна. Хватает и нескольких строк кода, и это для администратора, работает под основными браузерами и ладно. А вот то что клиент заведует, это плохо, кстати заголовки не игнорируются, потому что ajax, но к сожалению не указ. Это и плохо, ищу может быть можно клиенту с сервером через заголовки подружится, хотя все закономерно, у браузера есть все основания "бздеть".

В конечном итоге выброшу наверное ajax в данном случае и запросы буду делать через iframe, и сервер будет определять параметры контента. Только у этого способа тоже есть минус, нельзя определить что север ответил, а этот момент важен.
Ответить с цитированием
  #13 (permalink)  
Старый 17.09.2020, 12:48
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,698

Ну не знаю
Вот такой простой скрипт
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
  <meta name="viewport" content="width=device-width, initial-scale=1.0" >
  <title> LOAD ZIP </title>
</head>
<body >
<button id=load>Load and save zip</button>
<span id='ldl'></span>
<script>
document.getElementById('load').addEventListener('click',
	() => {
		let filename; 
		fetch('getzip.php')
		.then (res => { 
			filename = res.headers.get("filename")
			return res.blob();
		})
		.then (blob => {
			document.getElementById('ldl').innerHTML = `Прочитан ${filename} ${blob.size} байт`; 
			let url = URL.createObjectURL(blob);
			let a = document.createElement('a');
			a.href =  url;
			a.download = filename;
			a.click();
			URL.revokeObjectURL(url)
		})

	}
)
</script>
</body>
</html>


С вот таким простым PHP

<?php

function file_force_download($file) {
    // заставляем браузер показать окно сохранения файла
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('filename: ' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    // читаем файл и отправляем его пользователю
    readfile($file);
    exit;
}

file_force_download('test.zip');
?>


Считывает zip и правильно сохраняет и в FF и в Chrome
Ответить с цитированием
  #14 (permalink)  
Старый 17.09.2020, 16:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Ну в общем то тоже самое и я делал, с отличием только того, что await fetch ... Попробую так.
Ответить с цитированием
  #15 (permalink)  
Старый 23.09.2020, 20:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

То-ли старею, то-ли хренею, но вроде бы писал о результате, а его нет.

Так и не понял в чем проблема то была. Ну то что FF не дает указанный тип просто так сохранять, это прихоть браузера. А вот дальше ... В общем было так - была функция, которая вызывалась по событию. Я ее сделал асинхронной и в ней response await fetch... у response брал и заголовок. В общем это и все отличие клиентское, в принципе тоже самое. На сервере тот же самый набор стандартных заголовков (из них половину можно выбросить, оставив важные).
Но у меня предлагал имена какие я описывал, а этот последний код, voraa, действительно работает без проблем, что за хрень.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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