|
Автор |
Сообщение |
Anderson
Завсегдатай
Зарегистрирован: 08.07.2006 Сообщения: 642 Откуда: localhost
|
|
|
|
Итак, поступил мне заказ. Есть SSL-страница под логином и паролем с отчетами, которые скачиваются тоже по SSL. Линки засунуты в onClick в *быдляцкую* функцию отдавания файла. Нужно одним кликом скачивать все файлы.
Задание довольно простое, не так ли?
Но не тут-то было... Четыре дня почти день и ночь парился. Итак:
1) Решил файлы зиповать. Вырезал линки через свой скрипт в JS-закладке и отправлял на свой фришный хостинг на byethost, чтобы там зазиповать и скачать.
Неудача: Оттуда файлы хрен заберешь, т.к. скрипт на хостинге не почему-то не может залогинится по HTTPS, плюс с айпой в куках, сессиями и сотнями редиректов геморой. Сколько не пробовал - только баги в PHP повсплывали. А если б и получилось, траффик вдвойне тратится.
2) Нарыл библу для зипования файлов прямо в памяти с помощью JS (!). Зипованные отдавал как "location.href='application/zip;base64,'+zip1.generate();". Почти рабочий метод, только ексепшены по нехватке памяти.
Начал нервничать. Начало казатся, что это невозможно. Ставить левые плагины нельзя. И тут... Наконец-то правильно погуглил.
http://www.captain.at/programming/xul/
Оказывается, при правильной настройке привилегий мозилка умеет писать в файлы и папки, а также читать из них. Я прозрел.
Вот, кажется, и все. Готовый исходник, который будет в закладке, привожу ниже.
Код: |
javascript:
function save(fname, content) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("Permission to save file was denied.");
}
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( fname );
if ( file.exists() == false ) {
file.create( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420 );
}
var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance( Components.interfaces.nsIFileOutputStream );
outputStream.init( file, 0x04 | 0x08 | 0x20, 420, 0 );
var result = outputStream.write( content, content.length );
outputStream.close();
}
var dir=prompt('Please enter directory where to put downloaded files: ', 'C:\\invoices');
var total='';
var k=0;
var t='';
var newlinks = new Array();
links=document.getElementsByTagName('a'); for(i=0;i<links.length;i++) {
if(links[i].href.indexOf('viewbill/invoices#')>0) { var ev=''+links[i].onclick; var start=ev.indexOf('Popup("')+7; var end=ev.indexOf('", "pdf');
t=''+ev.substr(start,end-start); if(t!='') { newlinks[k]=t; k++; } } }
/*alert('Links: '+k+'\n'+newlinks.join(';'));*/
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead UniversalBrowserWrite");
var i=0;
document.write("<html><body style='background-color: #e0e0e0'><h1>Downloading "+k+" files into "+dir+" ...</h1></body></html>");
function req()
{
if (window.XMLHttpRequest) var xmlhttp=new XMLHttpRequest();
else var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
document.write('<b style="color: green">Downloading '+(i+1)+' of '+k+' ...');
xmlhttp.open("GET",'https://filexfer.ups.com/billinghostapp?FileIdentifier='+newlinks[i],false);
xmlhttp.overrideMimeType('text/plain; charset=x-user-defined');
xmlhttp.send();
document.write('Done! </b><br />\n');
var r=xmlhttp.responseText;
disposition=xmlhttp.getResponseHeader("Content-Disposition");
fname=disposition.substr(disposition.indexOf('filename=')+9);
save(dir+'\\'+fname, r);
}
for(i=0;i<k;i++) req();
|
Функция save решает.
ВАЖНО: Для работы мезанизма установки привилегий в конфигах необходимо поставить в "about:config" значение "signed.applets.codebase_principal_support" равным "true".
Детали: http://www.mozilla.org/projects/security/components/signed-scripts.html
В очередной раз убедился в превосходстве Мозиллы. Поклонялся им и далее буду поклонятся. Молодцы они! _________________ ArchLinux + Enlightenment 17 (E17) |
|
Вернуться к началу |
|
|
Anton99
Neo
Зарегистрирован: 26.11.2006 Сообщения: 1676
|
|
|
|
Я ничего не понял, но код красивый. :3 |
|
Вернуться к началу |
|
|
олег алексеевич
Тысячник
Зарегистрирован: 18.01.2009 Сообщения: 1365 Откуда: ua Кропивницкий
|
|
|
|
на хостинге,где мой сайт,нужно платить за SSL сертификаты.
Цитата: |
Неудача: Оттуда файлы хрен заберешь, т.к. скрипт на хостинге не почему-то не может залогинится по HTTPS, плюс с айпой в куках, сессиями и сотнями редиректов геморой. Сколько не пробовал - только баги в PHP повсплывали.
|
_________________ помощь в личку платно.Удалю вирус,шелл с сайта Джумла, Битрикс .
Создам плагин , модуль под заказ для VirtueMart , JoomShopping |
|
Вернуться к началу |
|
|
lem
Участник тусовки
Зарегистрирован: 21.09.2009 Сообщения: 118 Откуда: ua Днепропетровск
|
|
|
|
В закладки
Код: |
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch (e) {
alert("Permission to save file was denied.");
} |
Решение привязано только к мозилле?
Anderson писал(а): |
В очередной раз убедился в превосходстве Мозиллы. Поклонялся им и далее буду поклонятся. Молодцы они! |
А еще + такие аддоны как - firebug, web developer, greasemonkey, и куча других - превосходный инструмент... |
|
Вернуться к началу |
|
|
|
|
 Главная страница сайта
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|