Avatar billede phrozia Juniormester
16. april 2013 - 19:08 Der er 4 kommentarer

Zip mappe eller filer og send download

Hejsa!

Jeg skal bruge et script som kan zippe en mappe eller alle filerne deri og sende afsted som download.

Jeg har forsøgt med alverdens script fra nettet, men alle retunere enten en tom zip fil eller ingen ting.

Jeg gætter på at noget af udfordinger ligger i, at mappen/filerne ligger "uden for webcontent". Det vil sige at der er 2 mapper på serveren:

htdocs/admin/download.php (her ligger websitet)
userdate/ (her ligger filerne)

I scriptene peger jeg på userdata via ../../userdata/

Nogen som ligger inde med et script som virker?
Avatar billede olebole Juniormester
16. april 2013 - 20:00 #1
<ole>

Det burde ikke betyde noget, at filerne ligger over webroden. Prøv at vise en kode, du ikke kan få til at virke. Så retter vi den

/mvh
</bole>
Avatar billede phrozia Juniormester
16. april 2013 - 21:02 #2
Det lader til at jeg i min gen-søgen (jeg havde jo dumpet alle tidligere ikke fungerende scripts) har fundet et som virker. Dog er zippen ikke klar med det samme, så acceptere man file download for hurtigt, så er zip'en invalid.

<?php
// Cleaning up from last zip
if(file_exists("../../../userdata/invoices.zip"))
    {
    echo "Erasing old file...";
    unlink("../../../userdata/invoices.zip");
    }

function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

Zip('../../../userdata', '../../../userdata/invoices.zip');

// Fetching file and posting to the browser!
$yourfile = "../../../userdata/invoices.zip";

$file_name = basename($yourfile);

header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Length: " . filesize($yourfile));

readfile($yourfile);
exit;
?>

(Hvordan poster man kode som kodeformatteret?)
Avatar billede olebole Juniormester
16. april 2013 - 22:04 #3
Prøv evt:

if (Zip('../../../userdata', '../../../userdata/invoices.zip')) {
    // Fetching file and posting to the browser!
    $yourfile = "../../../userdata/invoices.zip";
   
    $file_name = basename($yourfile);
   
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($yourfile));
   
    readfile($yourfile);
    exit;
}

- og måske usleep(100000); i første linje indenfor IF'en(?)
Avatar billede phrozia Juniormester
26. maj 2014 - 16:19 #4
Pyh, det er dårlig stil at jeg først svarer nu. Beklager Ole :(

Kan du smide et svar så jeg kan lukke?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester