2017-04-21 264 views
0

因此,我創建了一些php代碼來使用ZipArchive創建zip文件。這將創建一個zip文件並下載它。要啓動下載,我將包含下面php代碼的php文件鏈接放在iframe中。然後將此iframe插入到html文檔中。重新下載zip文件而不重寫zip文件 - ZipArchive PHP

因此,無論何時加載html文檔,下載器都會啓動。我在iframe標記中創建了onload屬性,它將調用一個函數來顯示重新下載按鈕。

因此,如果用戶單擊重新下載按鈕,我希望它再次下載同一個zip文件,但不能再次重新創建zip文件進程。我怎麼做?

謝謝!

我的HTML代碼:

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

爲phpfile.php我的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

你就必須存儲的地方解壓縮文件。並在調用ZipArchive之前先查找它。是的,這會在一段時間後佔用大量空間 – Forbs

+0

_「因此,無論何時加載html文檔,下載程序都會啓動」_,_「因此,如果用戶單擊重新下載按鈕」_位於哪裏「重新下載按鈕」? – guest271314

+0

@ guest271314重新下載按鈕將出現在HTML文檔中的iframe上方 –

回答

0

您可以使用XMLHttpRequest()fetch()獲取文件爲Blob,創建Blob URL使用URL.createObjectURL(),存儲參考Blob URL。在隨後的click元素檢查是否定義了Blob URL,如果是true,請撥打window.open()並將Blob URL作爲第一個參數,"_self"作爲第二個參數。該方法應該在客戶端瀏覽器中將該文件的單個副本存儲爲Blob URL,直到用戶關閉創建引用的document

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)); 
    } 
}); 

其中fetch()不支持

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不適用於safari –

+0

@HoaHo您嘗試使用哪個版本的safari? – guest271314

+0

macOS Sierra上的safari v10.0 Sierra –