php大文件上傳,下載,字節轉kb

我用的是easyUpload插件,前端根聽說明寫好以後後端寫一個接收接口。php

我用的是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格式輸出。thinkphp

拓展下能夠在$info裏面獲取文件大小等信息。apache

上述內容正常接收圖片啥的都沒問題,可是一旦遇到大文件會失敗的。json

由於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頁面所吃掉的最大內存,默認8Msession

將上述內容改成實際項目須要數量,重啓apache便可。app

 

--------------------------下載-------------------------thinkphp5

下載其實比較簡單,直接在<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;
}
相關文章
相關標籤/搜索