通过PHP下载文件

时间:2017-07-05 13:37:57

标签: php download server readfile

我试图下载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,但我认为这不会影响问题。

2 个答案:

答案 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,但我认为这不会影响问题。