002 $file_path = './download/download_cn.rar';
003
004 //使用方法
005 downFile($file_path);
006
007 // 服务器文件路径,下载文件名字(默认为服务器文件名),是否许可用户下载方式(默认可选),速度限制(默认自动),文件类型(默认所有)
008 function downFile($fileName, $fancyName = '', $forceDownload = true, $speedLimit = 0, $contentType = '') {
009 if (!is_readable($fileName))
010 {
011 header("HTTP/1.1 404 Not Found");
012 return false;
013 }
014
015 $fileStat = stat($fileName);
016 $lastModified = $fileStat['mtime'];
017
018 $md5 = md5($fileStat['mtime'] .'='. $fileStat['ino'] .'='. $fileStat['size']);
019 $etag = '"' . $md5 . '-' . crc32($md5) . '"';
020
021 header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT');
022 header("ETag: $etag");
023
024 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified)
025 {
026 header("HTTP/1.1 304 Not Modified");
027 return true;
028 }
029
030 if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE'])
031 {
032 header("HTTP/1.1 304 Not Modified");
033 return true;
034 }
035
036 if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
037 {
038 header("HTTP/1.1 304 Not Modified");
039 return true;
040 }
041
042 if ($fancyName == '')
043 {
044 $fancyName = basename($fileName);
045 }
046
047 if ($contentType == '')
048 {
049 $contentType = 'application/octet-stream';
050 }
051
052 $fileSize = $fileStat['size'];
053
054 $contentLength = $fileSize;
055 $isPartial = false;
056
057 if (isset($_SERVER['HTTP_RANGE']))
058 {
059 if (preg_match('/^bytes=(d*)-(d*)$/', $_SERVER['HTTP_RANGE'], $matches))
060 {
061 $startPos = $matches[1];
062 $endPos = $matches[2];
063
064 if ($startPos == '' && $endPos == '')
065 {
066 return false;
067 }
068
069 if ($startPos == '')
070 {
071 $startPos = $fileSize - $endPos;
072 $endPos = $fileSize - 1;
073 }
074 else if ($endPos == '')
075 {
076 $endPos = $fileSize - 1;
077 }
078
079 $startPos = $startPos
080 $endPos = $endPos > $fileSize - 1 ? $fileSize - 1 : $endPos;
081
082 $length = $endPos - $startPos + 1;
083
084 if ($length
085 {
086 return false;
087 }
088
089 $contentLength = $length;
090 $isPartial = true;
091 }
092 }
093
094 // send headers
095 if ($isPartial)
096 {
097 header('HTTP/1.1 206 Partial Content');
098 header("Content-Range: bytes $startPos-$endPos/$fileSize");
099
100 }
101 else
102 {
103 header("HTTP/1.1 200 OK");
104 $startPos = 0;
105 $endPos = $contentLength - 1;
106 }
107
108 header('Pragma: cache');
109 header('Cache-Control: public, must-revalidate, max-age=0');
110 header('Accept-Ranges: bytes');
111 header('Content-type: ' . $contentType);
112 header('Content-Length: ' . $contentLength);
113
114 if ($forceDownload)
115 {
116 header('Content-Disposition: attachment; filename="' . rawurlencode($fancyName). '"');
117 }
118
119 header("Content-Transfer-Encoding: binary");
120
121 $bufferSize = 2048;
122
123 if ($speedLimit != 0)
124 {
125 $packetTime = floor($bufferSize * 1000000 / $speedLimit);
126 }
127
128 $bytesSent = 0;
129 $fp = fopen($fileName, "rb");
130 fseek($fp, $startPos);
131 while ($bytesSent
132 {
133 if ($speedLimit != 0)
134 {
135 list($usec, $sec) = explode(" ", microtime());
136 $outputTimeStart = ((float)$usec + (float)$sec);
137 }
138
139 $readBufferSize = $contentLength - $bytesSent
140 $buffer = fread($fp, $readBufferSize);
141
142 echo $buffer;
143
144 ob_flush();
145 flush();
146
147 $bytesSent += $readBufferSize;
148
149 if ($speedLimit != 0)
150 {
151 list($usec, $sec) = explode(" ", microtime());
152 $outputTimeEnd = ((float)$usec + (float)$sec);
153
154 $useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000;
155 $sleepTime = round($packetTime - $useTime);
156 if ($sleepTime > 0)
157 {
158 usleep($sleepTime);
159 }
160 }
161 }
162 return true;
163 }
164 ?>

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver CS6
视觉化网页开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。