|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。 普通来讲, 咱们可以经由过程直接让URL指向一个位于Document Root上面的文件, 来引诱用户下载文件.
然而, 如许做, 就没举措做一些统计, 权限反省, 等等的任务. 因而, 良多时分, 咱们采取让PHP来做转发, 为用户供应文件下载.
$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header("Content-Length: ". filesize($file));
readfile($file);
然而这个有一个成绩, 就是假如文件是中文名的话, 有的用户能够下载后的文件名是乱码.
因而, 咱们做一下修正(参考: :
$file = "/tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream");
//处置中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header('Content-Disposition: attachment; filename="' . $filename . '"');
header("Content-Length: ". filesize($file));
readfile($file);
输入的时分, 假如是Apache + PHP mod, 那末还需求发送到Apache的输入缓冲区. 最初才发送给用户. 而关于Nginx + fpm假如他们分隔安排的话, 那还会带来额定的收集IO.
恩, 如今看起来很多多少了, 不外还有一个成绩, 那就是readfile, 固然PHP的readfile测验考试完成的尽可能高效, 不占用PHP自己的内存, 然而实践上它仍是需求采取MMAP(假如撑持), 或是一个固定的buffer去轮回读取文件, 直接输入.
那末, 能不克不及不经由PHP这层, 直接让Webserver直接把文件发送给用户呢?
明天, 我看到了一个成心思的文章: How I PHP: X-SendFile.
咱们可使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户:
$file = "/tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream");
//处置中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
//让Xsendfile发送文件
header("X-Sendfile: $file");
Lighttpd和Nginx也有相似的模块, 人人有乐趣的可以去找找看
X-Sendfile头将被Apache处置, 而且把呼应的文件直接发送给Client.
总的来说,在这一个月左右的时间中,学到的不少,但是也遇到不少的问题,比如批量图片的上传,一直到现在也不懂,如何实现动态的增加上传图片的数量。 |
|