我有以下代碼使用帶進度條的XMLHttpRequest下載文件。內容長度沒有在請求但設置標題...下載後文件不會打開
編輯:
的目的是展示千兆速度和通用的10 Mbps連接之間的差。用戶將一個大型視頻文件全部下載到Mac上。
進度條在頁面上顯示,文件在幾秒鐘內保存到磁盤...然後用戶啓用硬件開關,限制到10Mbps並再次下載,這次肯定會中止330MB文件的傳輸。
PHP(的download.php):
<?
$file='/path/to/some/video.mp4';
header('Content-Description: File Transfer');
header('Content-Type: video/mp4');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
ob_clean();
flush();
readfile($file);
?>
的JavaScript:
var req = new XMLHttpRequest();
req.onprogress=updateProgress;
req.open('GET', 'download', true);
req.setRequestHeader("Content-Type","video/mp4");
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
...
}
};
req.send();
function updateProgress (evt) {
console.log(evt);
var percentComplete = Math.round(evt.loaded * 100/330581733);
$('#downloadProgress').val(percentComplete);
$('#progressVal').html(percentComplete.toString() + '%');
}
我的要求包含了除其在$ filsize是呼應的Content-Length的每一個頭......讀330581733( 330MB和一些變化)。我的進度函數使用確切的數字進行測試,但應該是evt.total;
第一部分:爲什麼Content-Length頭不可用?
第二部分:下載完成後,它爲什麼不打開,它到底在哪裏?
youi無法使用ajax將文件下載到操作系統。 ajax獲取字符串或blob或數組緩衝區數據。如果需要,您可以自行獲取這些數據並自行下載。嘗試http://danml.com/js/download.js在較新的瀏覽器中將字符串下載到指定文件中。 – dandavis
我不同意... XMLHttpRequests可用於檢索信息和文件系統,然後存儲到客戶端硬盤上的文件。 Chrome彈出一個窗口,問我是否可以將一個大文件保存到我的磁盤上,這樣我就走在了正確的軌道上。 – zgr024
除非您從文件夾運行頁面,否則XMLHttpRequests不提供對客戶端硬盤驅動器的訪問權限,在這種情況下,瀏覽器通常允許只讀訪問,但這不會幫助您保存任何內容。如果下載的文件應該在下載菜單中。如果它不在那裏,那麼這個文件就會出現在內存中,或許是由某個臨時文件支持的。由於您的服務器設置配置,只需將視頻網址傳遞給window.open(url)即可下載。大多數瀏覽器在下載時顯示進度條。 – dandavis