Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Есть ли в JS средства наподобие сокетов или Curl? (https://javascript.ru/forum/misc/65450-est-li-v-js-sredstva-napodobie-soketov-ili-curl.html)

iNfantry 20.10.2016 00:53

Есть ли в JS средства наподобие сокетов или Curl?
 
Подскажите пожалуйста, есть ли какие-то сетевые функции в жс? В частности, возможно ли как-то контролировать процесс скачивания файла пользователем с целью отображения собственного прогрессбара? Или к примеру можно ли скачать средствами жс удаленный файл? Сделать нечто подобное while (!feof($f1)) fwrite($f2, fread($f1)); ?

Aetae 20.10.2016 01:15

1. Нет. Можно скачать в память браузера, а потом отдать пользователью, но это гейская практика.
2. xmlhttprequest/fetch

iNfantry 20.10.2016 01:36

Цитата:

Сообщение от Aetae (Сообщение 432317)
1. Нет. Можно скачать в память браузера, а потом отдать пользователью, но это гейская практика.
2. xmlhttprequest/fetch

1. Как это скачать в память браузера? Поясни пожалуйста или ссылкой кинь.
2. Да точно, аякс, только вопрос - скачал я допустим файл обычным способом через xmlhttprequest, а как после этого вызвать диалог сохранения скаченного файла? Ну или клик по ссылке инициировать, только ссылка НА ЧТО?

Aetae 20.10.2016 01:53

1. См. пункт 2 из предыдущего поста.)
2. data:uri \ Blob, атрибут download.

iNfantry 20.10.2016 02:05

Круто, спасибо! Всё понял, то что надо! :dance: :victory:

iNfantry 20.10.2016 02:08

Кстати, вопрос вдогонку - если есть большой буфер (скаченный файл) - если я сделаю buf = null; память освободится или нет? Или как правильно положено ее освободить?

Aetae 20.10.2016 02:11

Если просто буффер, то да. Но если создана ссылка на blob, то её необходимо освободить. Как и везде в javascript - объект не будет собран GC пока на него есть хотя бы одна ссылка.

iNfantry 20.10.2016 02:26

Всё предельно понятно, теперь всё разрулено! :thanks:

Яростный Меч 20.10.2016 03:22

Цитата:

Сообщение от iNfantry
контролировать процесс скачивания файла пользователем с целью отображения собственного прогрессбара

Интересно, зачем?
Когда файл скачивается традиционным способом, большинство современных браузеров и так показывают прогрессбар. Нахрена юзеру твой прогрессбар видеть?

И кстати, рассмотреный в топике вариант с блоком упирается в ограничения по размеру, что-то в районе 500 мб, по крайней мере полтора года назад так было, сейчас не знаю. К сожалению, аякс (пока) не умеет загружать прямо на диск, блоб формируется в оперативе. Потому на больших файлах отваливается.

warren buffet 20.10.2016 05:56

Яростный Меч, где этот бар в ФФ? Было уже такое, я запомнил и когда закачивался бекап бд начал осматривать ФФ - никаких признаков жизни. Нажал Ctlr+J - увидел. Может я его спрятал этот бар?

ТСу. Прогресс на скачивание файла делается элементарно, ищи по слова js progress download

iNfantry 20.10.2016 12:55

Цитата:

Сообщение от warren buffet (Сообщение 432329)
ТСу. Прогресс на скачивание файла делается элементарно, ищи по слова js progress download

Не особо то и ищется, я уже сделал такое с помощью обычного аякса и коллбака на онпрогресс, есть еще какие-то варианты?

Aetae 20.10.2016 13:04

В принципе - есть: пользователь скачивает файл по персональной уникальной ссылке. Сервер соединён со скриптом на странице по вебсокету(или классической ему альтернативе) и риалтайм посылает в js отчёты по текущему скачиваемому фрагменту. Немного вычислений и прогрессбар готов. Теоретически это возможно, а вот как сделать на практике со стороны сервера - сходу не скажу. С другой стороны, сервер - не моя забота, хехехе.

iNfantry 20.10.2016 13:39

Кстати, только щас обнаружил косяк по основному вопросу (со скачкой файла) файл то бьётся! Размер примерно в два раза больше получается чем реальный, можешь подсказать что не так?

$.ajax({
	url: obj.data('url'),
	type: 'GET',
	xhr: function(){
		var xhr = $.ajaxSettings.xhr();
		xhr.onprogress = function(event) {
			jq_span.text(Math.ceil(event.loaded / event.total * 100) + '%');
		}
		return xhr;
	},
	success: function(body) {
		var blob = new Blob([body], {type: 'audio/mp3'});
		var url = URL.createObjectURL(blob);
		var jq_a = $('<a href="' + url + '" download="' + obj.data('title') + '.mp3">dl</a>');
		jq_a.hide().insertAfter(obj);
		jq_a[0].click();
		setTimeout(function(){window.URL.revokeObjectURL(url)}, 100);
	}
});

iNfantry 20.10.2016 14:00

И сам же опять разобрался)) Просто использовал xmlhttprequest напрямую с responsetype = 'blob', только хотелось бы еще узнать как это с помощью самого jquery ajax сделать, чтоб "все как у людей" было...


Часовой пояс GMT +3, время: 07:54.