2017-04-21 2 views
0

Ich erstelle also einen PHP-Code, um mit ZipArchive eine Zip-Datei zu erstellen. Dadurch wird eine Zip-Datei erstellt und heruntergeladen. Um den Download zu initiieren, stelle ich den Link auf die PHP-Datei, die den PHP-Code enthält, in einen Iframe. Dieser Iframe wird dann in ein HTML-Dokument eingefügt.ZIP-Datei erneut herunterladen, ohne Zip-Dateien neu zu schreiben - ZipArchive PHP

Also immer wenn das HTML-Dokument geladen wird, wird der Downloader initiieren. Ich habe das Onload-Attribut im iframe-Tag erstellt, das eine Funktion zum Anzeigen einer Redownload-Schaltfläche aufruft.

Wenn also der Benutzer auf die Redownload-Schaltfläche klickt, möchte ich, dass dieselbe ZIP-Datei erneut heruntergeladen wird, aber den ZIP-Dateiprozess nicht erneut erstellen. Wie mache ich das?

Danke!

MY HTML-Code:

<iframe src="phpfile.php" onload="myFrameLoad(this)"></iframe> 

MY PHP-Code für phpfile.php:

$coreFiles = Array('blah.jpg', 'blo.png'); 
# create new zip object 
$coreZip = new ZipArchive(); 

# create a temp file & open it 
$tmp_file = tempnam('.',''); 
$coreZip->open($tmp_file, ZipArchive::CREATE); 

# loop through each file 
foreach($coreFiles as $coreFile){ 
    # download file 
    $download_file = file_get_contents($coreFile); 
    #add it to the zip 
    $coreZip->addFromString(basename($coreFile),$download_file); 
} 

# close zip 
$coreZip->close(); 

# send the file to the browser as a download 
header('Content-disposition: attachment; filename=myZipFolder.zip'); 
header('Content-type: application/zip'); 
readfile($tmp_file); 
+1

unterstützt würden Sie die Datei irgendwo entpackt speichern müssen. und suchen Sie erst nach dem Aufruf von ZipArchive. Ja, das nimmt nach einer Weile viel Platz in Anspruch – Forbs

+0

_ "Also, wann immer das HTML-Dokument geladen wird, wird der Downloader" _, _ "initiieren. Wenn also der Benutzer auf den Redownload-Knopf" _ Wo ist der Redownload-Knopf "steht? – guest271314

+0

@ guest271314 Die Redownload-Schaltfläche wird über dem iFrame im HTML-Dokument angezeigt –

Antwort

0

Sie können XMLHttpRequest() oder fetch() verwenden Datei als Blob zu bekommen, erstellen Blob URL Verwenden Sie URL.createObjectURL(), speichern Sie die Referenz auf Blob URL. Bei click bei Elementprüfung, ob Blob URL definiert ist, wenn true, window.open() mit Blob URL als erster Parameter, "_self" als zweiter Parameter aufrufen. Der Ansatz sollte eine einzelne Kopie der Datei im Client-Browser als Blob URL speichern, bis der Benutzer document schließt, der die Referenz erstellt hat.

html

<button>download</button> 

Javascript

let url = w = void 0; 
document.querySelector("button").addEventListener("click", e => { 
    if (url) { 
    w = window.open(url, "_self") 
    } 
    else { 
    fetch("phpfile.php") 
    .then(response => response.blob()) 
    .then(blob => { 
     url = URL.createObjectURL(blob); 
     w = window.open(url, "_self") 
    }) 
    .catch(err => console.error(err)); 
    } 
}); 

wo fetch() nicht

let url = w = void 0; 
document.querySelector("button").addEventListener("click", e => { 
    if (url) { 
    w = window.open(url, "_self") 
    } 
    else { 
    let request = new XMLHttpRequest(); 
    request.open("GET", "phpfile.php", true); 
    request.responseType = "blob"; 
    request.onload =() => { 
     url = URL.createObjectURL(request.response); 
     w = window.open(url, "_self") 
    } 
    request.onerror = err => console.error(err); 
    request.send(null); 
    } 
}); 
+0

Blob funktioniert nicht auf Safari –

+0

@HoaHo Welche Version von Safari versuchen Sie? – guest271314

+0

safari v10.0 auf macOS Sierra –

Verwandte Themen