Autor | Zpráva | ||
---|---|---|---|
roboti006 Profil * |
#1 · Zasláno: 3. 2. 2012, 18:25:09
Ahoj. Snažím se udělat PHP skript,
který by měl podle informace v URL ($_GET) určit skupinu souborů, kterou by měl zazipovat, a odeslat uživateli ke stažení. Většina z toho se mi už povedla, ale když to zkouším stáhnout, uložím to do složky, a můj winzip to není schopný otevřít a píše: Archiv má buďto neznámý formát,nebo je poškozen. Je to tady. "file=" v adrese znamená název skupiny, která je hodnocená se switchem Kód vypadá takto: <? $s = $_GET['file']; switch($s){ case "poc": $soubor = array("./mailer.php", "./counter.php"); break; } $zip = new ZipArchive; foreach ($soubor as $files) { if($zip->open('test.zip') === TRUE){ $zip->addfile($files); }} $zip->close(); header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: 8bit\r\n"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"test.zip\""); header("charset=\"UTF-8\""); readfile ($soubor); if(readfile ($soubor)){ echo '<a href="http:sjiaphoto.euweb.cz/?pg=downos">Zpět</a>'; } else {echo 'Něco je špatně, ale určitě to není vaše chyba ;) <a href="http:sjiaphoto.euweb.cz/?pg=downos">Zpět</a>';} ?> |
||
Davex Profil |
#2 · Zasláno: 4. 2. 2012, 19:00:04
roboti006:
Máš správně nastavená práva do adresáře skripty/ na 0777, aby do něj mohlo PHP zapisovat? Krom toho, funkci readfile() použij jen jednou, při úspěšném odeslání nic nevypisuj přes echo , kontrolu vytvoření archivu prováděj před jeho odesíláním, archiv vytvoř jen jednou a teprve soubory přidávej v cyklu. Také by nebylo od věci, kdyby sis zapnul zobrazování chyb od PHP.
|
||
roboti006 Profil * |
#3 · Zasláno: 4. 2. 2012, 20:32:06 · Upravil/a: roboti006
Žádné chyby to nehlásí. Jen to stáhne nefunkční soubor,
práva mám na 0777, funkci readfile() pokud dobře vidím, mám jen jednou a to ještě jen v IFu. Uznávám že jsem dal špatné zařazení kontroly, tady je fix: <? $s = $_GET['file']; switch($s){ case "poc": $soubor = array("./mailer.php", "./counter.php"); break; } $zip = new ZipArchive; foreach ($soubor as $files) { if($zip->open('test.zip') === TRUE){ $zip->addfile($files); }} $zip->close(); if(readfile ($soubor)){ header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: 8bit\r\n"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"test.zip\""); header("charset=\"UTF-8\""); readfile ($soubor); } else { header("Location: http://sjiaphoto.euweb.cz/domos.php?pg=downos&type=error"); } ?> nedaří se stáhnutí, ale přenechá mě to rovnou headeru a posílá k chybové hlášce, která ještě není zprovozněná. Omlouvám se, přehlédl jsem... <? $s = $_GET['file']; switch($s){ case "poc": $soubor = array("./mailer.php", "./counter.php"); break; } if($soubor){ $zip = new ZipArchive; $zip->open('test.zip'); foreach ($soubor as $files) { $zip->addfile($files); } $zip->close(); } if(readfile ($soubor)){ header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: 8bit\r\n"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"test.zip\""); header("charset=\"UTF-8\""); readfile ($soubor); } else { header("Location: http://sjiaphoto.euweb.cz/domos.php?pg=downos&type=error"); } ?> |
||
fandaa Profil |
#4 · Zasláno: 4. 2. 2012, 20:39:11
roboti006:
Podívej se na funkci readfile (hlavně na příklad použití). Navíc jako parametr nebude $soubor, ale $zip pokud se nemýlím. |
||
roboti006 Profil * |
#5 · Zasláno: 4. 2. 2012, 21:48:56
<? $s = $_GET['file']; switch($s){ case "poc": $soubor = array("./mailer.php", "./counter.php"); break; } if($soubor){ $zip = new ZipArchive; $zip->open('test.zip'); foreach ($soubor as $files) { $zip->addfile($files); } $zip->close(); } if(readfile ($zip)){ header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: 8bit\r\n"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"test.zip\""); header("charset=\"UTF-8\""); readfile ($soubor); } else { header("Location: http://sjiaphoto.euweb.cz/domos.php?pg=downos&type=error"); } ?> pravidlo u readfile() |
||
fandaa Profil |
#6 · Zasláno: 4. 2. 2012, 22:19:14
roboti006:
> To s tím $zip mi došlo, sotva jsem to poslal, ale není mi jasné co jsem porušil za > pravidlo u readfile() Odkázal jsem tě tam, aby ses podíval na ten příklad použití. Zřejmě by sis pak všiml, že na řádku 22 bude v readfile také $zip. |
||
Davex Profil |
#7 · Zasláno: 5. 2. 2012, 00:14:04
roboti006:
> funkci readfile() pokud dobře vidím, mám jen jednou > a to ještě jen v IFu. Tak vidíš špatně a zrovna v té podmínce by vůbec neměla být. V podmínce by se mělo jen testovat, zda archiv existuje. Jsou tam samozřejmě ještě další chyby, které naznačují, že lepíš dohromady kusy cizího kódu, kterému nerozumíš. |
||
roboti006 Profil * |
#8 · Zasláno: 5. 2. 2012, 13:05:18
Testovat existenci archívu takto:
if(file_exists($zip)) ?
je vůbec v $zip cesta k archívu? Dobrou polovinu jsem doplnil sám, a dost jsem to upravil protože by to neplnilo moje požadavky :D Jak vypadají chyby po slepování cizích kódů, když neprodukují chybové hlášky, jako středníky, neuzavřené závorky atp.? |
||
Keeehi Profil |
#9 · Zasláno: 5. 2. 2012, 13:48:23
roboti006:
„je vůbec v $zip cesta k archívu?“ Je takový problém to zjistit pomocí echo $zip; ? Ale odpověď je ne. V $zip je objekt vytvořený z třídy ZipArchive.
Jinak soubor se jmenuje test.zip. Máte to na 10. řádku. if(file_exists("test.zip")) A pak samozřejmě nebude readfile($soubor) ale readfile("test.zip") .
„Jak vypadají chyby po slepování cizích kódů“ Požívají se v něm proměnné tam kde by měli být jiné, jelikož lepič neví, co je v které tak tipuje, která to je. Nebo se v kódu začne objevovat dříve nedefinovaná proměnná. To je pak lepič absolutní, který zná akorát ctrl + c a ctrl + v a vůbec nic neupravuje. |
||
Davex Profil |
#10 · Zasláno: 5. 2. 2012, 14:21:35
roboti006:
„Jak vypadají chyby po slepování cizích kódů“ Jen doplním Keeehiho, že absolutní lepič používá útržky cizího kódu na špatných místech a pro jiný účel, takže tím způsobuje další chyby, které v původním kódu nebyly. Jako třeba: header("Content-Transfer-Encoding: 8bit\r\n"); header("charset=\"UTF-8\""); |
||
roboti006 Profil * |
#11 · Zasláno: 6. 2. 2012, 17:02:49
Nevím jestli zrovna toto je tak závažný problém, aby to kvůli němu stáhlo prázdný, nebo vadný archiv...
Potřebuju spíš aby se to tam vůbec zabalilo, a potom stáhlo. Z nějakého důvodu se mi archiv nevytvoří ani na serveru, natožpak aby se stáhl. |
||
Davex Profil |
#12 · Zasláno: 6. 2. 2012, 19:58:01
roboti006:
„Z nějakého důvodu se mi archiv nevytvoří ani na serveru“ Já ho tam vidím, že se vytváří. Ten download skript ho jenom neposílá. |
||
roboti006 Profil * |
#13 · Zasláno: 8. 2. 2012, 10:15:56
Tak teď mi to stahuje soubor, bohužel soubor zase hlásí chybu že je vadný.
http://sjiaphoto.euweb.cz/skripty/download.php?file=poc - zkuste si to možná na to přijdete Myslím že, je to chyba buďto při balení, nebo v headeru ale nejsem si jistý. <? $s = $_GET['file']; switch($s){ case "poc": $soubor = array("./mailer.php", "./counter.php"); $name = $s.'.zip'; break; } if($soubor){ $zip = new ZipArchive; $zip->open("test.zip"); foreach ($soubor as $files) { $zip->addfile($files); } $zip->close(); header("Content-Type: application/x-zip"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"./test.zip\""); header('Content-Length: ' . filesize($zip)); readfile ($zip); } ?> |
||
Keeehi Profil |
#14 · Zasláno: 8. 2. 2012, 16:46:19
Řádek 20 není správně. Už jsem to psal v [#9].
|
||
Davex Profil |
#15 · Zasláno: 8. 2. 2012, 19:29:17
Keeehi:
„Řádek 20 není správně.“ Když se to vezme do detailu, tak řádek 19 je také špatně a řádky 6 a 16 jsou zbytečné. roboti006: Nauč se odsazovat bloky kódu, takto se v tom za chvíli nevyznáš. |
||
Keeehi Profil |
#16 · Zasláno: 8. 2. 2012, 22:27:00
roboti006:
<? $s = isset($_GET['file']) ? $_GET['file'] : NULL; switch($s){ case "poc": $soubor = array("./mailer.php", "./counter.php"); break; } if(isset($soubor)){ $name = tempnam(".", "zip"); $zip = new ZipArchive; $zip->open($name); foreach ($soubor as $files) { $zip->addfile($files, ZipArchive::OVERWRITE); } $zip->close(); if(file_exist(test.zip)) { header("Content-Type: application/zip"); header("Content-Length: " . filesize($name)); header("Content-Disposition: attachment; filename=\"test.zip\""); readfile ($name); unlink ($name); } } ?> |
||
Časová prodleva: 27 dní
|
|||
mikin.cz Profil * |
#17 · Zasláno: 7. 3. 2012, 04:46:52
Měl jsem podobný problém.
Stažený soubor neotevřel ani Windows, ani WinRar, ale bez problému šel otevřít pomocí 7-zipu. |
||
Časová prodleva: 11 let
|
0