我试图下载zip文件而不向用户透露URL。该文件只能由授权用户访问。
目前我正在这样做:
// check authentication and request method etc...
// ...
$file = '../../filename.zip';
$filesize = filesize($file);
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: private');
header('Content-Length: ' . $filesize);
ob_clean();
flush();
echo readfile($file);
die();
我可以看到文件以某种方式在Chrome网络标签中下载(它显示在“响应”标签中)并传输~3MB(这是文件大小),但文件未在浏览器中下载。
我正在做一个简单的GET请求,顺便说一句。
感谢您的帮助, 托拜厄斯
编辑:好吧,显然我在客户端也遇到了错误,现在该文件正在浏览器中下载,但它只有1KB的zip包含{{1} }。
我的请求如下:
Response with status: 200 OK for URL: xxx
EDIT2:好的,明白了。显然我必须在请求中使用let headers = new Headers({'Accept': 'application/zip'});
let options = new RequestOptions({ headers: headers, responseType: ResponseContentType.Blob });
this.authHttp.post(environment.apiUrl + 'rewards/download/', data, options)
.map(res => new Blob([res],{ type: 'application/zip' }))
.catch((error:any) => Observable.throw(error.json().error || 'Server error'))
.subscribe(
data => {
//console.log(data);
window.location.href = window.URL.createObjectURL(data);
},
error => {
console.log("Error downloading file.");
},
() => console.log("Download completed."));
。此外,我现在使用FileSaver.js而不是window.location,但我认为这不会影响问题。
答案 0 :(得分:0)
我认为你只需要将ur方法重定向到你的体格zip文件。
我的意思是你只需要添加:
header("Location: $url_physique_of_ur_zip_file");
之前
ob_clean(); 冲洗();
并用您文件的体格网址替换$ url_physique_of_ur_zip_file
我希望你理解我,因为这个解决方案适合我
答案 1 :(得分:0)
好的,明白了。显然我不得不在请求中使用.map(res => new Blob([res.json()],{type:' application / zip'}))。此外,我现在使用FileSaver.js而不是window.location,但我认为这不会影响问题。