| 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: 14 let
|
|||
0