5. PHP 文件操作
1.5.1. 下载文件
header("Content-type:text/html;charset=utf-8"); /** * 文件下载 * @param [type] $file_url [绝对路径,如:$_SERVER['DOCUMENT_ROOT'].'/upload/file/2019/01/18/test.png';] * @param [type] $new_name [指定文件名称] * @return [type] [description] */ function downloadFile($file_url,$new_name=''){ if(!isset($file_url)||trim($file_url) == ''){ echo '500'; } //检查文件是否存在 if(!file_exists($file_url)){ echo '404'; } $file_name=basename($file_url); $file_type=explode('.',$file_url); $file_type=$file_type[count($file_type)-1]; $file_name=trim($new_name=='')?$file_name:urlencode($new_name); $file_type=fopen($file_url,'r'); //打开文件 //输入文件标签 header("Content-type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Accept-Length: ".filesize($file_url)); header("Content-Disposition: attachment; filename=".$file_name); //输出文件内容 echo fread($file_type,filesize($file_url)); fclose($file_type); }
几点注意事项
header("Content-type:text/html;charset=utf-8")
的作用:在服务器响应浏览器的请求时,告诉浏览器以编码格式为 UTF-8 的编码显示该内容。- 关于 file_exists() 函数不支持中文路径的问题:因为 php 函数比较早,不支持中文,所以如果被下载的文件名是中文的话,需要对其进行字符编码转换,否则 file_exists() 函数不能识别,可以使用 iconv() 函数进行编码转换。
$file_sub_path()
我使用的是绝对路径,执行效率要比相对路径高。Header("Content-type: application/octet-stream")
的作用:通过这句代码客户端浏览器就能知道服务端返回的文件形式。Header("Accept-Ranges: bytes")
的作用:告诉客户端浏览器返回的文件大小是按照字节进行计算的。Header("Accept-Length:".$file_size)
的作用:告诉浏览器返回的文件大小。Header("Content-Disposition: attachment; filename=".$file_name)
的作用:告诉浏览器返回的文件的名称。- 以上四个 Header() 是必需的。
fclose($fp)
可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区
参考资料
1.5.2. 获取当前 URL
function getCurrentPageURL() { $pageURL = 'http'; if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") { $pageURL .= "s"; } $pageURL .= "://"; if ($_SERVER["SERVER_PORT"] != "80") { $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"]; } else { $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]; } return $pageURL; }
1.5.3. curl 请求处理
function curl( $url = '',$method = 'GET',$req_data = false,$header = false,$response_header = false,$exec_time = 5,$connect_time = 5 ) { $method = strtoupper( $method ); $ch = curl_init(); // 设置请求 url curl_setopt( $ch,CURLOPT_URL,$url ); // 设置请求方法,默认执行 GET 请求,无需设置 if( 'POST' == $method ){ curl_setopt( $ch, CURLOPT_POST,1 ); }elseif( 'GET' != $method ){ curl_setopt( $ch, CURLOPT_CUSTOMREQUEST,$method ); } // 设置请求头 if( null != $header && is_array($header) ){ curl_setopt( $ch,CURLOPT_HTTPHEADER,array_map(function($field,$value){ return $field . ':' . $value; }, array_keys($header), $header) ); } // 设置请请求数据 if( null != $req_data && 'GET' != $method ){ if ( is_array($req_data) && !isset($req_data['isfile']) ){ $req_data = http_build_query($req_data); } curl_setopt( $ch,CURLOPT_POSTFIELDS,$req_data ); } //设置输出数据中包含 http header curl_setopt( $ch, CURLOPT_HEADER,$response_header ); // 将 curl_exec() 获取的信息以字符串返回,而不是直接输出 curl_setopt( $ch,CURLOPT_RETURNTRANSFER,true ); // 允许 cURL 函数执行的最长秒数。 curl_setopt( $ch,CURLOPT_TIMEOUT,$exec_time ); //在尝试连接时等待的秒数。设置为 0,则无限等待 curl_setopt( $ch,CURLOPT_CONNECTTIMEOUT,$connect_time ); // 执行 curl 请求 $response = curl_exec($ch); //获取状态码 $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); //关闭 curl 回话并释放资源 curl_close($ch); //分离 header 与 body if( $response_header ){ $tmp = explode("\r\n\r\n", $response); $resp_header = $tmp[0]; $data = $tmp[1]; } else { $resp_header = null; $data = $response; } $result['errcode'] = $status; $result['header'] = $resp_header; $result['data'] = $data; return $result; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 4. PHP 数组操作
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论