InternInhaltsverzeichnisGlossarBausteineLinklisteTutorialsKommentare

Thema: PHP - Zip-Archiv erstellen und Datei herunterladen Artikel anzeigen

CarSiMir ✶✶✶✶✶ schrieb am Mittwoch, den 22 Januar 2020 #1
Danke für das super Script. Ich habe festgestellt, dass es bei größeren Ordnern Schwierigkeiten gibt die in eine zip File zu packen. Es erscheint nach kurzer Zeit "500 Internal Server Error". Gibt es eine ähnliche Lösung für größere Ordner?

Gruß CarSiMir
Werner schrieb am Mittwoch, den 22 Januar 2020 #2
Meistens ist dann die Zeit in dem das Script ausgeführt wird zu kurz dann erscheint ein "500 Internal Server Error".
Mit: echo ini_get('max_execution_time'); kannst du die Zeit in Sekunden anzeigen lassen die in der php.ini eingestellt ist.
Für das Script kannst du die Zeit erhöhen: ini_set('max_execution_time', '120');
amsel schrieb am Sonntag, den 19 September 2021 #3
habe das Script erfolreich einbauen können habe nur ein prob und muste es etwas abändern

// Zip-Archiv erstellen und Datei herunterladen

// Beachten Sie, das hiermit keine Verzeichnisse gelesen
// werden können die ihrerseits Verzeichnisse enthalten!
$verzeichnis = ($GLOBALS["IMGHOST_PIC_DIR"]);
$zip_name = $GLOBALS["IMGHOST_PIC_ZIP"]."/".$CURUSER['id']."-image.zip";

// Verzeichnis auslesen
$dateien = strval(("/pic-".$data['name'].$endu));

// Neue Instanz der ZipArchive Klasse erzeugen
$zip = new ZipArchive;

// Zip-Archiv erstellen
$status = $zip->open($zip_name, ZipArchive::CREATE);

if ($status === TRUE) {

// Dateien ins Zip-Archiv einfügen
$zip->addFile($verzeichnis . $dateien, $dateien);

// Zip-Archiv schließen
$zip->close();

if ((file_exists($zip_name))) {
echo '<p><a href="' . $zip_name . '">' . $zip_name . '</a></p>';
}
}
wenn ich das scipt so ausführe funzt es aber es macht mir bei
echo '<p><a href="' . $zip_name . '">' . $zip_name . '</a></p>';
mehrere untereinander und nicht nur ein Button wie es in dem Script steht hat wer eine Idee was ich da machen kann.

mfg amsel
Werner schrieb am Sonntag, den 19 September 2021 #4
Ungetestet:

1
2
3
4
5
6
7
8
<?php
// ...
$var "";
if ((
file_exists($zip_name))) {
 
$var '<p><a href="' $zip_name '">' $zip_name '</a></p>';
}
echo 
$var;
?>
amsel schrieb am Sonntag, den 19 September 2021 #5
Thx für ihre Antwort leider immer noch das selbe
user_uploads/img-host/1-image.zip

SPAM :(

mfg amsel
Werner schrieb am Montag, den 20 September 2021 #6
Ein Dateiname darf unter Windows keinen Schrägstrich (Slash) enthalten!

Es soll also nur eine Datei in ein Zip-Archiv gelegt werden?
Warum wird das Script so oft aufgerufen, mache mal nach der Ausgabe ein: exit;

Zitat:
$dateien = strval(("/pic-".$data['name'].$endu));
Auch hier ist wieder ein Slash drin!
Meine Lösung mit einer Datei im Archiv:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
// Zip-Archiv erstellen und Datei herunterladen

// Beachten Sie, das hiermit keine Verzeichnisse gelesen
// werden können die ihrerseits Verzeichnisse enthalten!
$verzeichnis "neu/";
$zip_name "beispiel2.zip";

// Dateiname
$datei = ("bild.jpg");

// Neue Instanz der ZipArchive Klasse erzeugen
$zip = new ZipArchive;

// Zip-Archiv erstellen
$status $zip->open($zip_nameZipArchive::CREATE);

if (
$status === TRUE) {

 
// Dateien ins Zip-Archiv einfügen
 
$zip->addFile($verzeichnis $datei$datei);
 
 
// Zip-Archiv schließen
 
$zip->close();
 
 if ((
file_exists($zip_name))) {
 echo 
'<p><a href="' $zip_name '">' $zip_name '</a></p>';
 }
}
?>


$zip->addFile($verzeichnis . $datei, $datei);

$datei = Originalname
$datei = Geänderter Name!

$zip->addFile($verzeichnis . $datei, "pic-0815.jpg");
amsel schrieb am Montag, den 20 September 2021 #7
Guten Abend so erstelle ich das ZIP die daten vom User werden über eine foreach schleife über geben
leider hatte ich bei $zip->addFile($verzeichnis . $dateien, $dateien); eine array to string conversion das selbe auch hier $dateien = array(scandir(strval($verzeichnis)),"/pic-".$data['name'].$endu); deshalb hatte ich das etwas abgeändert

<?php
if(isset($_GET['action']) AND $_GET['action'] == 'zip_complete'){
$result = $db -> queryObjectArray('img_host', array('*'), "WHERE user = '".$CURUSER['id']."' ");
if (is_array($result) || is_object($result)){
foreach($result as $data){
if($data['gif'] == 'yes'){$endu = '.gif';}else{$endu = '.jpg';}

// Zip-Archiv erstellen und Datei herunterladen

// Beachten Sie, das hiermit keine Verzeichnisse gelesen
// werden können die ihrerseits Verzeichnisse enthalten!
$verzeichnis = ($GLOBALS["IMGHOST_PIC_DIR"]);
$zip_name = $GLOBALS["IMGHOST_PIC_ZIP"]."/".$CURUSER['id']."-image.zip";

// Verzeichnis auslesen
$dateien = strval(("/pic-".$data['name'].$endu));
#$dateien = array(scandir(strval($verzeichnis)),"/pic-".$data['name'].$endu);
// Neue Instanz der ZipArchive Klasse erzeugen
$zip = new ZipArchive;

// Zip-Archiv erstellen
$status = $zip->open($zip_name, ZipArchive::CREATE);

if ($status === TRUE) {

// Dateien ins Zip-Archiv einfügen
#if (is_array($dateien) || is_object($dateien)){
# foreach ($dateien as $datei) {

$zip->addFile($verzeichnis . $dateien, $dateien);
#}
#}
// Zip-Archiv schließen
$zip->close();
if (file_exists($zip_name)) {
echo '<p><a href="' . $zip_name . '">' . $zip_name . '</a></p>';
}
?>

mfg amsel
Werner schrieb am Dienstag, den 21 September 2021 #8
Hallo,
ein ziemliches Durcheinander ;)
Wo wird die foreach-Schleife wieder geschlossen?

foreach($result as $data){

Setze oben in die erste Zeile:

error_reporting(E_ALL);
ini_set('display_errors', true);
amsel schrieb am Mittwoch, den 22 September 2021 #9
Guten Abend Werner,
über if (file_exists($zip_name))

hatte die beiden } oben ausgeklammert gehabt beim kopieren vom Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
if(isset($_GET['action']) AND $_GET['action'] == 'zip_complete'){
    
$result $db -> queryObjectArray('img_host', array('*'), "WHERE user = '".$CURUSER['id']."' ");
    if (
is_array($result) || is_object($result)){ 
        foreach(
$result as $data){
            if(
$data['gif'] == 'yes'){$endu '.gif';}else{$endu '.jpg';}

            
## Zip-Archiv erstellen und Datei herunterladen

            ## Beachten Sie, das hiermit keine Verzeichnisse gelesen
            ## werden können die ihrerseits Verzeichnisse enthalten!
            
$verzeichnis = ($GLOBALS["IMGHOST_PIC_DIR"]);
            
$zip_name $GLOBALS["IMGHOST_PIC_ZIP"]."/".$CURUSER['id']."-image.zip";

            
## Verzeichnis auslesen
            
$dateien strval(("/pic-".$data['name'].$endu));
            
## Neue Instanz der ZipArchive Klasse erzeugen
            
$zip = new ZipArchive;

            
## Zip-Archiv erstellen
            
$status $zip->open($zip_nameZipArchive::CREATE);

            if (
$status === TRUE) {
                
## Dateien ins Zip-Archiv einfügen
                
$zip->addFile($verzeichnis $dateien$dateien); 
                
## Zip-Archiv schließen
                
$zip->close();
            }
                
##test ende 
        
}
    }
        if (
file_exists($zip_name)) { 
                echo 
'<p><a href="' $zip_name '">' $zip_name '</a></p>'
        } exit;
}
?>

Soweit hab ich es jetzt hinbekommen, es kommt nur noch ein Download Bouton. Aber durch das EXIT macht er danach eine Weiße Seite mit dem Download Bouton.

mfg amsel
Werner schrieb am Donnerstag, den 23 September 2021 #10
Ich habe immer noch Schwierigkeiten dein Script zu verstehen!
Bei jedem foreach-Durchlauf wird die Variable: $zip_name überschrieben. Ist das so richtig, und am Ende soll nur eine Datei heruntergeladen werden?

Zitat:
Aber durch das EXIT macht er danach eine Weiße Seite mit dem Download Bouton.


1
2
3
4
5
        if (file_exists($zip_name)) { 
          echo '<html> blabla';
             echo '<p><a href="' . $zip_name . '">' . $zip_name . '</a></p>'; 
          echo '</html>';
        } exit;