Autor Zpráva
roboti006
Profil *
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
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 *
Žá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");
}
?> 
Teď když mám trochu poopravené,
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
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 *
<?
$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");
}
?>
To s tím $zip mi došlo, sotva jsem to poslal, ale není mi jasné co jsem porušil za
pravidlo u readfile()
fandaa
Profil
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
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 *
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
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
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 *
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
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 *
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
Řádek 20 není správně. Už jsem to psal v [#9].
Davex
Profil
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
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);
    }
}
?>
mikin.cz
Profil *
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.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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