大文件下載可采用附件流的方式,后端設置一下響應參數,然后以流的方式返回前端
res.set({ "Content-Type": "application/octet-stream", "Content-Disposition": "attachment;filename* = UTF-8''"+fixedEncodeURIComponent(filename),"Content-Length": stats.size });
pipeline(fs.createReadStream(filepath), res, (err) => { if (err) { if (err.code!="ERR_STREAM_PREMATURE_CLOSE") { logger.error("下載出錯"); return res.end('error!!!'); } } });
前端直接瀏覽器下載最好,不用干預下載過程
window.open( filedownloadurl+"?fsid="+fsid)
該例程可以直接在新標簽頁打開鏈接執行下載,不過這種訪問方式被限定為GET,參數包含在url中,不太安全,也有一些長度和字符編碼限制。
那么能否以POST方式在新標簽頁打開鏈接執行下載呢?
要曲線救國一下,可以form方式提交POST請求:
var data = {...fsid: fsid,...};var form = $('<form action="' + filedownloadurl + '" method="post" target="_blank"></form>');$.each(data, function(key, value) {form.append('<input type="hidden" name="' + key + '" value="' + value + '">');});$('body').append(form);form.submit();
form的target屬性設為_blank,可以在新窗口里提交表單,如此可以實現POST方式在新窗口打開url