Autor Zpráva
zetrozet
Profil *
PHP skript s vloženým JavaSkriptem má po načtení stránky spustit stahování (existujícího) souboru. V ostatních prohlížečích je stahování bez problémů zahájeno, v IE pouze problikne okno volaného skriptu ale ke stahování souboru nedojde. Pokud je "stahovací" skript volaný stiskem tlačítka, je stahování souboru zahájeno ve všech prohlížečích včetně IE.
Vyzkoušet lze na "http://test.zetrozet.com/U2010/cisfu39.exe"

Moderátor Chamurappi: Odmazán nekompletní zdroják PHP. Proč sem dáváš dlouhé a zcela nesouvisející kódy? PHP se zpracovává na serveru, prohlížeč vidí jen výstup.
zetrozet
Profil *
Posledně jsem od Tebe dostal vynadáno, že chybí souvislosti... Jinak mi jde právě o to, jak nasat PHP, aby bylo "spokojeno" co nejvíce běžně používaných prohlížečů a dělalo to, co se o nich chce. Na MSIE mám eminentní zájem, protože k němu byla dotlačena (nikoli mnou) většina mých uživatelů. A kde jinde, než v PHP se má větvit kód podle $_SERVER['HTTP_USER_AGENT'] než na serveru.

 
<?
// tady byla funkce nezadouciip(), kterou si Chamurapi nepřál, jako nesouvisející kód
 if (isset($_GET['fold'])) $fold=$_GET['fold'];
 if (isset($_GET['file'])) $file=$_GET['file'];
 $URL=strtolower(strtok($_SERVER['SERVER_PROTOCOL'], '/')).'://'.$_SERVER['SERVER_NAME'].'/';
// define('URL',		strtolower(strtok($_SERVER['SERVER_PROTOCOL'], '/')).'://'.$_SERVER['SERVER_NAME'].'/');
 echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
 echo "<html><head>\n";
 echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=windows-1250\">\n";
 echo "<style type=\"text/css\">";
 echo "<!--\n";
 echo "@import url('/engine/styl.css');";
 //pokud je prohlížeč opera, je třeba upravit vzhled
 if (strpos($_SERVER['HTTP_USER_AGENT'],"Opera")) {
  echo "body {height:83%;margin-left:170px;}\n";
  echo "#menu {position:absolute;left:0px;top:90px;height:78%;float:none}\n";
}
 echo "-->\n";
 echo "</style>\n";
 echo "<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\n";
 echo "<link rel=\"shortcut icon\" href=\"./engine/favicon.ico\" type=\"image/x-icon\">\n";
 if (file_exists($fold."/".$file)) {
  echo "<title>Stránka nalezena</title>\n";
  echo "</head>\n";
  echo "<body background=\"".$URL."/engine/pozadi1.jpg\" onLoad=\"window.open('".$URL."down_hibi.php?fold=".$fold."&amp;file=".$file."','');\" >\n";
  echo "<h1 align=\"center\">&nbsp;</h1><h1 align=\"center\">Soubor je připraven ke stažení</h1>\n";
  echo "<p align=\"center\">Soubor, o který jste požádali, Vám byl předán ke stažení/spuštění. Lze jej případně najít procházením z <a href=\"/\">hlavní stránky</a>.</p>";
 } else {
  echo "<title>Stránka nenalezena</title>\n";
  echo "</head>\n";
  echo "<body background=\"./engine/pozadi1.jpg\">\n";
  echo "<h1 align=\"center\">&nbsp;</h1><h1 align=\"center\">Stránka nebyla nalezena</h1>\n";
  echo "<p align=\"center\">Soubor, o který jste požádali, nebyl na serveru nalezen. Zkuste jej najít procházením z <a href=\"/\">hlavní stránky</a>.</p>\n";
  echo "<p align=\"center\"><strong>Kód chyby: 404</strong></p>";
}
 echo "<p align=\"center\"><strong>Požadovaná stránka: ";
 echo $URL.$fold."/".$file;
 echo "</strong></p><br>\n";
 echo "<p align=\"center\"><script language=\"javascript\">\n";
 echo " document.write('<form name=\"form1\">'); \n";
 if (!nezadouciip() && file_exists($fold."/".$file)) {
  echo " document.write('<input type=\"button\" value=\"Opakovat stahování\" onClick=\"window.open('".$URL."down_hibi.php?fold=".$fold."&amp;file=".$file."','');\"/> &nbsp;');\n";
 }
  echo " document.write('<input type=\"button\" value=\"Zavřít okno\" onClick=\"self.close();\"/></form>'); \n";
  echo "</script></p><br>";
 echo "<p align=\"center\"><strong>Kontakt na správce: info@trunecek.cz</strong></p>\n";
 echo "<div style=\"display:visible\"><script>\n<!--\n";
 echo "document.write ('<img src=\"http://toplist.cz/dot.asp?id=1108564&http='+escape(document.referrer)+'&wi='+escape(window.screen.width)+'&he='+escape(window.screen.height)+'&cd='+escape(window.screen.colorDepth)+'\" width=\"88\" height=\"60\" border=0 alt=\"TOPlist\" />');\n"; echo "-->\n";
 echo "</script><noscript><img src=\"http://toplist.cz/dot.asp?id=1108564&\" border=\"0\" alt=\"TOPlist\" width=\"88\" height=\"60\" /></noscript>";
 echo "</div></body></html>";
?>
Chamurappi
Profil
Reaguji na zetrozeta:
kde jinde, než v PHP se má větvit kód podle $_SERVER['HTTP_USER_AGENT'] než na serveru
Větvení je z hlediska problému irelevantní. Prohlížeč vidí jen výstup PHP skriptu. Zajímá-li tě, proč nefunguje v jednom z prohlížečů jeden z výstupů, stačí pochopitelně ukázat ten jeden výstup a ne postup, jakým se generuje.

mi jde právě o to, jak nasat PHP
Nejde. Proto se ostatně ptáš v kategorii JavaScriptu. S PHP ti neporadím, to naštěstí neznám.

Když se podívám na výsledný HTML kód s onloadem (který posíláš všem prohlížečům stejný):
<body background="http://test.zetrozet.com//engine/pozadi1.jpg" onLoad="window.open('http://test.zetrozet.com/down_hibi.php?fold=U2010&amp;file=cisfu39.exe','','width=1,height=1'); " >
Otevírání vyskakovacího okna mi na tvé stránce nefunguje v žádném prohlížeči, všechny ho při výchozím nastavení zablokují a tak to má být, protože to uživatele zpravidla štve.
zetrozet
Profil *
Je možné rozlišit, jestli měl uživatel při najetí stránky povoleno nebo zakázáno vyskakovací okno a podle toho upravovat text tlačítka buď "Opakované stažení/spuštění" nebo jen "Stažení/spuštění"?
Chamurappi
Profil
Reaguji na zetrozeta:
Je. Ale procento těch, kdo mají vyskakovací okna povolená, je zanedbatelně malé.
zetrozet
Profil *
Procento uživatelů účtujících v DOS-programech je dnes už taky zanedbatelně malé. Přesto 100% mých zákazníků používá pro účtování DOS-programy. Někteří pro účetnictví, jiní pro daňovu evidenci a někteří pro obojí.
Nejhorší na tom je, že mnozí z nich si s počítačem rozumějí méně, než pětileté dítě.
Chamurappi
Profil
Reaguji na zetrozeta:
Jasně, a proto je z hlediska komunikace se zákazníkem nejlepší nedávat moc možností a hnát je všechny stejnou cestou, bez odboček v uživatelském rozhraní. Abys jim pak nemusel do telefonu říkat „teď vám možná vyskočí okno a jestli náhodou ne, tak klikněte na tlačítko, které možná ukazuje ‚Opakované stažení‘ a možná jen ‚Stažení‘“.
zetrozet
Profil *
Chápu dobře míněné rady, ale přesto chci, aby se stahování zahájilo samo po dokončení načtení stránky.
<script> function a() {window.location='http://test.zetrozet.com/down_hibi.php?fold=U2010&file=cisfu39.exe';}</script>

Tenhle skript už spouštění stahování provádí spolehlivěji, jen v MSIE dává do horní lišty hlášku "V zájmu zabepečení ..." atd., je možné se té hlášky zbavit.
_es
Profil
zetrozet:
Prečo nedáš jednoducho odkaz na súbor a nech si s ním návštevník robí čo chce?
A keď už to má byť niečo "automatické", prečo do toho ťaháš JS, keď to nie je nutné?
Môžeš použiť napríklad iframe alebo presmerovanie meta značkou.
Chamurappi
Profil
Reaguji na zetrozeta:
jen v MSIE dává do horní lišty hlášku "V zájmu zabepečení ..." atd., je možné se té hlášky zbavit.
Jestli to měla být otázka, tak ne.

Proč se jednoduše nepodíváš na to, jak řeší stejnou situaci servery typu Slunečnice.cz nebo Stahuj.cz, které žijí z toho, že zprostředkovávají stahování programů širokým masám?
zetrozet
Profil *
Protože přesměrování meta-tagem mi v MSIE dávalo hlášku "V zájmu ochrany zabezpečení..." a tu jsem chtěl obejít. Proto jsem zkoušel javascript.
V počítačích uživatelů, kteří používají mé moduly pro DOS-programy (Účto Tichý + Stereo Ježek) mám systém, který zjistí novější verzi modulu, a zeptá se uživatele, jestli chce aktualizovat. Pokud uživatel souhlasí, systém stáhne *.exe do adresářové struktury Účta nebo Sterea a spustí aktualizaci.
To jsem dosud dělal přímým downloadem. Teď potřebuji zjistit, jestli vůbec někdo v průběhu roku aktualizuje nebo na to všichni kašlou. Ale jsou i takoví, co mají místo antiviráku internet na jednom počítači, účetnictví v druhém počítači a soubory přenášejí sem tam flashdiskem.
Chamurappi
Profil
Reaguji na zetrozeta:
přesměrování meta-tagem mi v MSIE dávalo hlášku "V zájmu ochrany zabezpečení..." a tu jsem chtěl obejít
Kdyby se ta bezpečnostní hláska dala takhle snadno obejít, nevyplatilo by se ji vyrábět.

Teď potřebuji zjistit, jestli vůbec někdo v průběhu roku aktualizuje nebo na to všichni kašlou.
I s přímým downloadem můžeš počítat přístupy. V tom svém PHP skriptu si poznamenáš přístup někam k sobě (do souboru či databáze, na ne Toplist) a jako výstup předhodíš obsah svého EXE souboru. Člověk ani nepozná, žes ho zaznamenal.

jsou i takoví, co mají místo antiviráku internet na jednom počítači, účetnictví v druhém počítači a soubory přenášejí sem tam flashdiskem
Nebo dokonce po disketách, to znám :-)
zetrozet
Profil *
Kdybys to stažení uměl tak, aby se to i programu v uživatelově počítači tvářilo jako přímé stažení http-přístupem a byl ochoten poradit, byl bych jen rád. Mě se takovéto "pokusy" vždycky zacyklily.
Chamurappi
Profil
Reaguji na zetrozeta:
Ale ten down_hibi.php, na který se z tvé stránky odkazuje, ti funguje, ne? Takže víš, jak v PHP vyslat ke stažení EXE soubor.

Mě se takovéto "pokusy" vždycky zacyklily.
Zřejmě jsi v něčem dělal chybu. Žádnou konkrétní radu nemám, PHP neumím…
zetrozet
Profil *
Chamurappi:
Zřejmě jsi v něčem dělal chybu.
Určitě v něčem dělám chybu, jen mi připadalo vhodnější napsat přímo, jak se ta chyba projevuje. Také proto, že down_hibi.php funguje, si myslím, že jde o chybu principielní, nezávislou na použitém programovacím jazyce.

Když chci uživatelův požadavek na download například "http://test.zetrozet.com/U2010/cisfu39.exe", a přitom chci, aby požadavek downloadu vypadal tak, jak ho uživatel odeslal a přitom ho .htaccess nepřesměrovával podruhé, tak jednak nevím, jak na to nebo taky neexistuje žádná finta, jak na to.
Witiko
Profil
Nějak takhle?

<? 

// zde patří kód přistupující k db vytvářející / updatující hodnotu v tabulce

header("Content-Description: File Transfer"); 
header("Content-Length: " . filesize("$soubor"));
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=\"$soubor\""); 
readfile ($soubor);
?>
zetrozet
Profil *
Takovéto jednoduché "přeposlání" obvykle znamenalo zacyklení, protože výstup skriptu přesměroval .htaccess zpátky na skript. V .htaccess se mi o nyní to přesměrování stará tento řádek (názvy adresářů se soubory jsou "S"+dvoumístné číslo nebo "U"+čtyřmístný rok a některé starší jsou z rootu přesunuty do adresáře "archiv"):

RewriteRule ^(.*)(archiv/)?(U[0-9][0-9][0-9][0-9]|O[0-9][0-9][0-9][0-9]|O[0-9][0-9]|S[0-9][0-9])/(.*)(\.exe|\.zip|\.pdf)$ $1/hibi.php?fold=$2$3&file=$4$5 [NC,R=301,NE,L]


Také jsem zkoušel zabránit zacyklení tím, že jsem cestu v hlavičce změnil z logické na fyzické umístění na serveru. To sice zabránilo zacyklení, ale zase tomu nerozuměly soubory, které v uživatelově počítači generovaly (a nerozuměl tomu například ani WGET.EXE).
Davex
Profil
To už jsme řešili ve vlákně Jak lze upravit Header v PHP-skriptu, aby .htaccess rozlišil. Stále se domnívám, že je chyba ve stahovacím skriptu, který pro odeslání souboru používá include(), ale funkci readfile() jsi víceméně odmítl a jiné řešení v tuto chvíli nevidím.
zetrozet
Profil *
Neřešili.
Skript volaný z .htaccess máš v příspěvku na začátku, a z ní volaný down_hibi.php je v podstatě totéž, co nabízí Witiko, je se tam logická cesta z http-volání nahrazuje fyzickou cestou ze $_SERVER["SCRIPT_FILENAME"].

Když jsem opustil řešení přes include() v index.php, zadal jsem nový samostatný dotaz, protože to s původním problémem a jeho řešeními přestalo věcněsouviset.
Davex
Profil
Ono je to podobné v tom, že se na stejném URL nemohou vyskytovat dvě různé věci.

Možná se mýlím, ale z toho přepisovacího pravidla jsem to pochopil tak, že se má na stejném URL nejdříve zobrazit stránka s výzvou ke stažení a pak ze stejného URL soubor stáhnout.
zetrozet
Profil *
Teď nechápu, co tím myslíš - na URL volaném uživatelem je soubor *.exe, *.zip případně *.pdf a ten soubor se má taky stáhnout, jen to má udělat php-skript, který je na úplně jiném URL. Spouštěný hibi.php je v rootu webu, ve stejném rootu je i volaný down_hibi.php, který má (v této chvíli na test.ztrozet.com) stažení provést. Soubory, které mají být stahovány, jsou v podadresářích například ./U2010/*.*, ./S18/*.* nebo .archiv/S16/*.* a na tomto místě jsou taky programem v uživatelově počítači hledány.
Davex
Profil
Takže uživatel má zadat do prohlížeče adresu souboru http://test.zetrozet.com/U2010/cisfu39.exe, jehož stažení se má zaznamenat skriptem down_hibi.php, který ho zároveň odešle? Pak ale nelze zároveň zobrazit stránku "Soubor je připraven ke stažení" - zacyklilo se to pravděpodobně kvůli tomu, že přepisovací pravidlo podstrkává skript hibi.php stejnému URL jako má stahovaný soubor.
zetrozet
Profil *
Opačně - .htaccess při stahování *.exe a ostatních vybraných typů souborů volal hibi.php (je na začátku vlákna). Ten měl zaznamenat stahování (TopListem), a následně podle IP adresy nebo IP-name buď předat řízení down_hibi.php (a stáhnout) nebo oznámit, že stahování bylo zamítnuto.
Davex
Profil
Tak teď je mi to jasné. Pokud se má stahování zaznamenat Toplistem, tak to asi jinak udělat nejde.
zetrozet
Profil *
Protože TopList (zatím) pro evidenci vyžaduje nějaké zobrazení, tj.spuštění prohlížeče, tak budu muset změnit postupy nebo ukecat Francírka.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: