php大文件上传,下载,字节转kb

北城以北 提交于 2019-12-07 11:48:57

我用的是easyUpload插件,前端根据说明写好之后后端写一个接收接口。

我用的是thinkphp5

    public function upload(){
        $file = Request::instance()->file('file');
        //给定目录
//        var_dump($file);die;
        $info = $file->move('upload');
        var_dump($info);die;
        if($info && $info->getPathname()){
        	// echo $info->getPathname();die;
            return show(200,'success','/'.$info->getPathname());
        }
        return show(0,'upload error');
    }


function show($status, $message,$data=[]){
    return [
        'code'=> intval($status),
        'message'=>$message,
        'data'=>$data,
    ];
}

上面是后端程序config里面设置默认json格式输出。

拓展下可以在$info里面获取文件大小等信息。

上述内容正常接收图片啥的都没问题,但是一旦遇到大文件会失败的。

因为php默认是对于每个页面的内存,时间,上传文件等有限制的。需要修改php.ini文件已确保大文件上传。

upload_max_filesize = 8m ;允许上传文件大小的最大值。默认为2M
post_max_size = 8m ;表单POST给PHP能接收的最大值。默认为8M

max_execution_time = 30 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 60 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M

将上述内容改为实际项目需要数量,重启apache即可。

 

--------------------------下载-------------------------

下载其实比较简单,直接在<a href="链接地址">下载<a>即可,但这样不太安全,过于暴露。

将所有的下载转至统一页面进行安全验证后释放会比较好。

id是该文件的唯一标识,token算是保护措施,验证通过则提供下载。方法写的比较随意可以多多拓展,可以验证登录,ip,session啥的验证。

public function download($id,$token){
        if(!is_numeric($id) && $token != $this->token){
            die('error009');
        }

        $file_info = model('GameVersion')->getOneData('id = '.$id);//获取文件信息
        $file_url = '.'.$file_info['down_link'];
        $new_name = $file_info['resource_name'];
        if(!isset($file_url)||trim($file_url)==''){
            echo '500';
            die('error011');
        }
        if(!file_exists($file_url)){ //检查文件是否存在
            echo '404';
            die('error010');
        }

        $file_name=basename($file_url);//获取文件名
        $file_type=explode('.',$file_url);
        $file_type=$file_type[count($file_type)-1];//获取类型
        $file_name = $new_name.'.'.$file_type;//设置名称类型
        $file=fopen($file_url,'r'); //打开文件

        //输入文件标签
        header("Content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Accept-Length: ".$file_info['file_size']);
        header("Content-Disposition: attachment; filename=".$file_name);

        //输出文件内容
        echo fread($file,filesize($file_url));
        fclose($file);
    }

 

另外这里可能还会用到字节转kb或mb之类的需求,一并写在这里。

function kb($filesize){
    if ($filesize >= 1073741824) {
        $filesize = round($filesize / 1073741824 * 100) / 100 .' GB';
    } elseif ($filesize >= 1048576) {
        $filesize = round($filesize / 1048576 * 100) / 100 .' MB';
    } elseif($filesize >= 1024) {
        $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
    } else {
        $filesize = $filesize.' Bytes';
    }
    return $filesize;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!