5. PHP 文件操作

发布于 2024-07-27 02:33:52 字数 4467 浏览 44 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文