山河-PHP下载功能实现

大家好我是山河,有部分学习PHP的新手不太能理解这个PHP的下载功能啊,一般下载有些人直接丢文件之类的东西到服务器上,想让用户/游客下载,但是直接使用会,浏览器会解析你的文件,解析成功的就不能下载了,只能展示出来,就比如HTML,txt,JPG等文件/图片,怎么解决这个问题呢?我用PHP实现。三种方法实现,有两种只是写法不同。

当然,注释我也写好了,方便新手小白更好的理解。

上代码:

<?php

    // PHP 文件下载
    // 设定解析字符集
    header('Content-type:text/html;charset=utf-8');

    $file = 'cswjj/dom.png';    //设定下载的内容的路径

    //  设定下载响应头
    header('Content-type:application/octem-stream');    //以文件流形式传输数据给浏览器
    header('Accept-ranges:bytes');      //以字节方式计算(传递)     
    header('Content-disposition:attachment;filename=' . $file);     //附件下载,指定名字
    header('Accept-length:' . filesize($file));     //设置文件大小
    // 如果文件的名字是从文件夹读取出来,而且存在中文,那么如果直接使用名字作为下载名字会出现乱码
    // 出现这种情况需要进行字符转码: 从GBK转成 UTF-8: $file = iconv('GBK','UTF-8',$file); 

    // 输出文件
    // PHP5 小文件 (低于8兆用 8MB 效率更快)
    /*
        echo file_get_contents($file);
    */

// 哔哩哔哩: https://space.bilibili.com/442772630  up主:山河web UID:442772630

    // 方案2 文件比较大(网络不好) 可以使用PHP4 的文件操作方式 一次读取一点
    $f = @fopen($file,'r') or die();
    // 写法1 (更多人用) 直接读,然后输出
    while($row = fread($f,1024)) {
        echo $row;
    }

    // 写法2 判断是否可读,然后再读
    /*
        while(!feof($f)) {
            echo fread($f,1024);
        }   
    */

    // 关闭资源
    fclose($f);

?>

最后认识一下:

哔哩哔哩: https://space.bilibili.com/442772630                 up主:山河web       UID:442772630

山河-PHP文件上传功能实现

大家好我是山河,自学PHP有一段时间了,听大家说那个PHP的上传和下载功能不太能理解,所以呢我花点时间把上传功能实现了。

我是自学黑马程序员PInk老师的课程视频,代码之前学习的时候已经做了,现在就全部注释了分享给大家,让大家更直观的看懂代码。

理解>死记代码哈,这个大家要知道,编程思想才是重点,代码敲的快慢为次。先懂思想之后再练代码的速度。不要只抄。

话不多说,上代码。

<?php

// 设置编码
header('Content-type:text/html;charset=utf-8');

// PHP文件上传功能封装函数
// 图片
/*
is_array() 函数用于检测变量是否是一个数组
isset() 函数用于检测变量是否已设置并且非 NULL。
is_dir() 函数检查指定的文件是否是目录。
in_array() 函数搜索数组中是否存在指定的值。
*/


//山河 https://space.bilibili.com/442772630

function upload_single($file,$allow_type,$path,&$error,$allow_format = array(),$max_size = 2000000) {
    // 判断文件是否有效
    if(!is_array($file) || !isset($file['error'])) {
        // 文件无效
        $error = '不是一个有效的上传文件!';
        return false;
    }

    // 判断文件存储路径是否有效
    if(!is_dir($path)) {
        // 路径不存在
        $error = '文件存储路径不存在!';
        return false;
    }

    // 判断文件上传是否出错
    switch($file['error']) {
        case 1:
        case 2:
            $error = '文件超出服务器允许大小';
            return false;
        case 3:
            $error = '文件上传过程中出现问题,只上传一部分!';
            return false;
        case 4:
            $error = '用户没有选中要上传的文件!';
        case 6:
        case 7:
            $error = '文件保存失败!';
            return false;
    }

    //判断MIME 类型
    if(!in_array($file['type'],$allow_type)) {
        // 该文件不允许上传
        $error = "该文件类型不允许上传!";
        return false;
    }

    // 判断后缀是否允许
    // 取出后缀
    $ext = ltrim(strrchr($file['name'],'.'),'.');
    // 不为空且不为允许的后缀
    if(!empty($allow_format) && !in_array($ext,$allow_format)) {
        // 不允许上传
        $error = '当前文件的格式不允许上传!';
        return false;
    }

    // 判断当前文件大小是否满足当前需求
    if($file['size'] > $max_size) {
        // 文件过大
        $error = '当前上传的文件超出大小,最大允许:' . $max_size/1000 . 'kb!';
        return false;
    }

    // 构造文件名字:类型_年月日_随机字符串.$ext
    $fullname = strstr($file['type'],'/',TRUE) . date('YYYYmmdd');
    // 产生随机字符串
    for($i = 0;$i < 4;$i++) {
        $fullname .= chr(mt_rand(65,90));
    }
    // 拼凑后缀
    $fullname .= '.' . $ext;

    // 移动到指定目录
    if(!is_uploaded_file($file['tmp_name'])) {
        // 文件不是上传的
        $error = '错误:不是上传文件 !';
        return false;
    }

    if(move_uploaded_file($file['tmp_name'],$path . '/' . $fullname)) {
        // 成功
        return '托管后的文件路径' . $fullname;
    } else {
        // 移动失败
        $error = '文件上传失败 !';
        return false;
    }


}

// 提供数据
// 获取数据
$file = $_FILES['image'];
// 保存的路径
$path = 'demo-8-functions/';
// mime允许上传的类型
$allow_type = array(
    'image/gif',
    'image/jpeg',
    'image/bmp',
    'image/png',
    'image/pjpeg'
);
// 允许上传的后缀
$allow_format = array(
    'jpg',
    'jpeg',
    'gif',
    'png',
    'bmp',
    'pjpeg',
    'jpe'
);
// 允许上传的文件最大值
$max_size = 8000000;


//山河 https://space.bilibili.com/442772630

if($filename = upload_single($file,$allow_type,$path,$error,$allow_format,$max_size)) {
    echo $filename;
} else {
    echo $error;
}

?>

最后认识一下:

哔哩哔哩: https://space.bilibili.com/442772630    author: 山河web       UID:442772630