Вход

Просмотр полной версии : Вызов location.href в цикле


Роман Валерьевич
05.02.2014, 14:06
Здравствуйте. Имеется массив со списком url - адресов, при переходе по которым выполняется скачивание файла. Мне необходимо из javascript выполнить загрузку всех файлов по адресам из этого массива. выполняю

for (var i=0; i < rec_url.length; i++)
{
location.href = rec_url[i];
}

и загружается только последний файл на последней итерации.
Как организовать переход по всем ссылкам массива из скрипта? Понимаю, что возможно использую некорректный подход. Если есть другой вариант - подскажите.

P.s. в массиве url вида: http:// login: passowrd@host: port/download/byscript?name=GetRecordPath&startparam1=file.mp3&async=1&timeout=10 .

kostyanet
05.02.2014, 14:50
location.href = сделает редирект на то, чему =

kostyanet
05.02.2014, 14:53
Что значит "скачивание"? Вы можете из скрипта браузера сохранять файлы на диск не спрашивая юзера?

Роман Валерьевич
05.02.2014, 15:11
Что значит "скачивание"? Вы можете из скрипта браузера сохранять файлы на диск не спрашивая юзера?
Выполнение конструкции location.href = http:// login: passowrd@host: port/download/byscript?name=GetRecordPath&startparam1=file.mp3&a sync=1&timeout=10; приводит к загрузке файла. Файл скачивается автоматически, не спрашивая меня (в Хроме). В ff предлагает сохранить или открыть.

Моя задача - загрузить сразу пачку файлов на диск, по одному.
P.s.
файлы выдаются скриптом на сервере oktell (http://wiki.oktell.ru/%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D 0%B9_HTTP_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0% B5%D0%B9%D1%81#download )

Роман Валерьевич
05.02.2014, 15:15
location.href = сделает редирект на то, чему =

В том то и дело что редирект. А поскольку справа от = по сути идет ссылка на файл, то происходит его загрузка и браузер остается на изначальной странице. Т.е. получается что можно из скрипта инициировать загрузку только одного файла. Можно ли выполнить задачу групповой как-то иначе? Например, я пробовал в цикле вызывать через $.ajax php-скрипт, который выполняет редирект. Не силен пока в ajax, но способ которым пробовал я не сработал, поскольку вызываемый скрипт ничего не возвращает.

kostyanet
05.02.2014, 15:31
Хотите сказать что если выбирать из массива ссылки типа

http://javascript.ru/forum/images/ca_serenity/misc/logo.gif

и пихать их в location.href, то все картинки автоматически окажутся в папке даунлоада Хрома?

Другими словами я вам могу закачать на диск любые программы, скрипты и прочие _файлы_ не спрашивая вашего разрешения потому что Хром такая прелесть?

kostyanet
05.02.2014, 15:38
Ну да, если это ссылка на файл и сервер посылает заголовки типа "скОчай", то браузер предложит скачать, иначе откроет, или на выбор.

Скачивание дело времени, а цикл у вас выполняется за микросекунду. Теоретически вам требуется резервуар в который будет идти закачка и этот резервуар должен начать булькать когда очередной файл load.

Но лично я делал тупо и со вкусом. Допустим у меня есть вот такой же массив ссылок. Я генерю из них объекты и браузер все кОчает как миленький, асинхронно конечно, одни вперед, другие позже. Дождавшись полной загрузки я сохраняю пагу на диск как файл со всем ее файлОм, чтобы затем спокойно взять папку с ним и скопировать (перемещать нельзя, они связаны через файловую систему с хтмл).

Куда можно скачать музло, или что у вас там? Есть тег для музла? Вот и наделайте этих тегов по length массива.

kostyanet
05.02.2014, 15:43
Аяксом это method GETФайл скачивается автоматически, не спрашивая меня (в Хроме).

По-моему это звездешь. Такого не бывает. Ну или давайте напишем страницу с таким вот скриптом как вас, выложим и дадим изнутри ссылку на коллекцию всех кровей Рембо в ХаДэ. Веселуха будет...

Есть такой тег http://www.w3schools.com/tags/tag_audio.asp

Касательно аякса. Я все равно не понял что будет делать скрипт в функции на ответе сервера.

Роман Валерьевич
05.02.2014, 16:16
Хотите сказать что если выбирать из массива ссылки типа

http://javascript.ru/forum/images/ca_serenity/misc/logo.gif

и пихать их в location.href, то все картинки автоматически окажутся в папке даунлоада Хрома?

Другими словами я вам могу закачать на диск любые программы, скрипты и прочие _файлы_ не спрашивая вашего разрешения потому что Хром такая прелесть?
Я не хочу сказать, я спрашиваю. Действительно это есть небезопасно, но это единственный более-менее фурычащий способ который я нашел к моменту написания темы, поэтому с него и начал :)

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

Куда можно скачать музло, или что у вас там? Есть тег для музла? Вот и наделайте этих тегов по length массива.
Извините, не понял,- что вы сохраняете на диск? У меня записи разговоров из Oktell. Общую идею понял, спасибо! Но в моем случае скорее всего не подойдет. мне необходимо минимизировать действия оператора. В идеале: клацнул кнопку - слились файлы.

Аяксом это method GET

По-моему это звездешь. Такого не бывает. Ну или давайте напишем страницу с таким вот скриптом как вас, выложим и дадим изнутри ссылку на коллекцию всех кровей Рембо в ХаДэ. Веселуха будет...

Есть такой тег http://www.w3schools.com/tags/tag_audio.asp

Ну у меня это происходит. Возможно частный случай или какие-то определенные условия- не знаю. Скринкаст делать не буду :) А за тег audio спасибо! Покопаю в этом направлении.
Касательно аякса. Я все равно не понял что будет делать скрипт в функции на ответе сервера.
в том то и дело что ничего :), поэтому и не работает этот вариант.

Насколько я понял, по-нормальному вытянуть файлы по ссылке в фоне по одному из JS не удастся. Надо с другой стороны заходить как-то. Хм..

Роман Валерьевич
05.02.2014, 16:23
Мне не нужно выполнять загрузку как-то тайно или без согласия пользователя. Просто нужно выполнить это рационально. Грубо говоря, если сто файлов будет, чтобы пользователь 100 раз не клацал "да, сохранить". Быть может их как-то по ссылкам слить на сервер, запихнуть в архив и этот архив один выдавать уже на закачку.

kostyanet
05.02.2014, 16:38
Вы можете загрузить файл на страницу и сохранить страницу как файл со всеми загруженными файлами. Для оператора эникейщика это сверх его интеллекта. Только мало-мальски грамотный человек так может сделать и только с теми mime-типами, которые могут быть загружены на страницу как таковые.

Если я наделал кучу тегов <img src="http://example.com/example093.jpg"> то открыв страницу загружу все что перечислено. По той же схеме, наверно, можно загрузить и аудио-файлы, но боюсь что они струячаться. То есть начнут загружаться только в момент проигрывания.

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

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

kostyanet
05.02.2014, 16:41
Внешне выглядит как самый настоящий баян. Юзер жмет кнопку, или ссылку, скрипт по ссылке собирает файло, архивирует, копирует и выкатывает заголовки на скачивание. Юзер открывает файлу дорогу - поехали.

Кстати, то что загружено или создано на странице в html5 можно сохранить на диск как файл, не без диалога, конечно: http://eligrey.com/demos/FileSaver.js/

И бинарные файлы наверно можно. Но я все равно не понимаю что делать с ответом сервера, который выдал mp3 с соответствующим mime. То есть круг замыкается. Сервер должен выдавать что-то другое, блобное, но тогда зачем браузер мучить. На сервере все чисто можно сделать.

kostyanet
05.02.2014, 16:59
Тем не менее попробуйте применить что тут народ пишет, похожая задача:

http://stackoverflow.com/questions/6165266/downloading-mp3-files-using-html5-blobs-in-a-chrome-extension

Теоретически вы можете собрать в блоб загружаемые файлы, но практически я слабо представляю что затем с этим блобом делать.

Технология оправдана когда ресурс уже загружен или непосредственно создан в браузере. Ну то есть когда на сервере нет текста "привет Вася, кагдила", или картинки с мордой Васи, но все это есть в браузере и все это надо сохранить на диск как файл.

Если же данные на сервере - идите в сервер.

Роман Валерьевич
05.02.2014, 17:11
..Разумеется лучший способ это выдать файлы одним файлом с сервера. На php, в частности, полно встроенных и готовых решений по архивированию и скачиванию.

kostyanet, спасибо за советы и помощь! Буду использовать вариант с загрузкой файлов по ftp php-скриптом и архивированием.

Vlasenko Fedor
06.02.2014, 01:35
Файл скачивается автоматически, не спрашивая меня (в Хроме).
По-моему это звездешь. Такого не бывает
http://joomla25.fregate.org.ua/
слева внизу нажми на фотоаппарат в Хроме и Opera 19.0 :haha:

kostyanet
06.02.2014, 06:42
Проверил эту фишку:

var oB = new Blob(['some text'], {type:'text/html'});
var a = document.createElement('a');
window.URL = window.webkitURL || window.URL;
a.download = 'report.csv';
a.href = window.URL.createObjectURL(oB);
console.log(a.href);
a.click();


В консоль печтает blob: и какой-то код. Диалога сохранения файла не возникает. Полная тишина. Точно такой же код где ссылка реальная и кличется - работает.

UPD:

Надо просто воткнуть а-элемент в страницу, щелкнуть и тут же удалить, ну или по таймеру через сек, на всякий случай.

kostyanet
06.02.2014, 06:49
слева внизу нажми на фотоаппарат в Хроме

Это нажми, а не открой страницу и оно само загрузится.

И лечится очень просто Ask where to save each file before downloading - ON. По умолчанию OFF что лишний раз доказывает ламеризм ЦА гугле хрома. В котором и хронологию нельзя отключить.

Впрочем, я уже не помню что там по умолчанию в FF. Может быть точно такое же.

kostyanet
06.02.2014, 07:51
Ага, вот оно похоже на то:

http://stuk.github.io/jszip/

И в применении http://stackoverflow.com/questions/13790949/downloading-generated-binary-content-contains-utf-8-encoded-chars-in-disk-file

Да, и небольшие, как я понимаю, файлы можно сохранять через урл. http://stackoverflow.com/questions/13790949/downloading-generated-binary-content-contains-utf-8-encoded-chars-in-disk-file

В частности это один из стандартных методов сохранения canvas.