تالار گفتمان nCIS.ir

نسخه‌ی کامل: اضافه کردن resum برای دانلود
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
برای اینکه فایلی که میزاریم برای دانلود قابلیت resum داشته باشه چه کاری باید انجام بشه؟
درمورد تنظیم هدرهای HTTP-Range تحقیق کنید.
البته بهتره دانلود را از طریق mod_xsendfile بدیم دست Apache و مدیریت ارسال را خود سرور انجام بده.
(08-03-1396، 01:49 ب.ظ)ADMIN نوشته: [ -> ]درمورد تنظیم هدرهای HTTP-Range تحقیق کنید.

رفتم دنبال یه چیزای هم نوشتم ولی نمیدونم چرا دانلود رو میزنم یه فایل 17 کیلو بایتی بهم میده

کنترلر :

$data['fileData'] = $this->track_model->getUrlDownload($data['key']);
        if($data['fileData'] !== false){
            $timeexpire = $data['fileData']['time'];
            $now = time();
            $file = '';
            if($timeexpire < $now){
                redirect('download/time/2');
            }else{
                $url              = str_replace(" ","%20",$data['fileData']['url']);
                $mime             = substr(strrchr($url,'.'),1);//get mime type of file
                $data['mimType']  = ($mime == 'mp3') ? 'audio/mpeg' : '';//set mime type to mp3
                $fileSize = $this->curl_get_file_size($url);//get file size with curl
                $data['size']     = $fileSize;
                $data['fileSize'] = $this->formatSizeUnits($fileSize);//convert byte to MB for file size
                $foundCode = $this->existfile($url);//check exists file or not and return 400 or 200                 
                if($foundCode == 200){
                   $handel        = @fopen($url,'r');
                }else{
                     redirect(base_url().'track/faild'); 
                }                
                $fileName         = explode('/',$url);
                $data['begin']    = 0;
                $data['end']      = $fileSize - 1;
                $data['file']     = $file ;
                $data['fileName'] = end($fileName);
                $cur  = $data['begin'];
                //bigin isset
                if($handel != NULL){
                    while(!feof($handel) && $cur <= $data['end'] && (connection_status() == 0)){
                        $file .= fread($handel,min(1024 * 16, ($data['end'] - $cur) + 1));
                        $cur += 1024 * 16;
                    }                                         
                }else{
                    redirect(base_url().'track/faild');
                }
            }            
        }




کد view:


if (isset($_SERVER['HTTP_RANGE'])){
    if (preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
    {
        $begin  = intval($matches[1]);
        if (!empty($matches[2]))
        {
          $end  = intval($matches[2]);
        }
    }
}
if (isset($_SERVER['HTTP_RANGE'])) {
        header('HTTP/1.1 206 Partial Content');
}
else
{
    header('HTTP/1.1 200 OK');
}   
header("Content-Type: application/force-download");
header('Cache-Control: public, must-revalidate, max-age=0');
 
header('Accept-Ranges: bytes');
header('Content-Length:' . (($end - $begin) + 1));
if (isset($_SERVER['HTTP_RANGE']))
{
    header("Content-Range: bytes $begin-$end/$size");
}
header("Content-Disposition: attachment; filename=$fileName");
header("Content-Transfer-Encoding: binary"); 


گاهی حجم فایل رو درست نشون میده ولی موقع دانلود بعد 2-3 ثانیه ارور میده
گاهی هم حجم فایل رو 17 کیلوبایت نشون میده و دانلود میکنه همون 17 کیول بایتو
دانلودو میزنم  17 کیلو باید دانلود میکنه بعد میگه سرور کانکشن رو قطع کرده

[attachment=561]
فکر میکردم باید با fseek هربار که میخونم فایلو ادامشو بگیرم نیاد از اول
ولی اینم استفاده میکنم این ارورو میده stream does not support seeking
دوستان کسی راهی به ذهنش نمیرسه من کل کد هارو از کنترلر اوردم تو view فرقی نکرد

$CI =& get_instance();
$CI->load->helper('func');
if($fileData !== false){
    $timeexpire = $fileData['time'];
    $now = time();
    $file = '';
    if($timeexpire < $now){
        redirect('download/time/2');
    }else{
        $url              = str_replace(" ","%20",$fileData['url']);
        $mime             = substr(strrchr($url,'.'),1);//get mime type of file
        $mimType= ($mime == 'mp3') ? 'audio/mpeg' : '';//set mime type to mp3
        $fileSize = curl_get_file_size($url);//get file size with curl
        $size= $fileSize;
        $fileSize= formatSizeUnits($fileSize);//convert byte to MB for file size
        $foundCode = existfile($url);//check exists file or not and return 400 or 200         
        if($foundCode == 200){
           $handel        = @fopen($url,'rb');
        }else{
             redirect(base_url().'track/faild'); 
        }                
        $fName         = explode('/',$url);
        $begin   = 0;
        $end      = $fileSize - 1;
        $fileName = end($fName);                
        if (isset($_SERVER['HTTP_RANGE'])){
            if (preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
            {
                $begin  = intval($matches[1]);
                if (!empty($matches[2]))
                {
                  $end  = intval($matches[2]);
                }
            }
        }
        if (isset($_SERVER['HTTP_RANGE']))
        {
          header('HTTP/1.1 206 Partial Content');
        }
        else
        {
          header('HTTP/1.1 200 OK');
        }
        
        header("Content-Type: application/force-download");
        header('Cache-Control: public, must-revalidate, max-age=0');
        header('Pragma: no-cache');  
        header('Accept-Ranges: bytes');
        header('Content-Length:' . (($end - $begin) + 1));
        if (isset($_SERVER['HTTP_RANGE']))
        {

          header("Content-Range: bytes $begin-$end/$size");
        }
        header("Content-Disposition: inline; filename=$fileName");
        header("Content-Transfer-Encoding: binary");
        $cur  = $begin;
        fseek($handel, $begin, 0);
        if($handel != NULL){
            while(!feof($handel) && $cur <= $end && (connection_status() == 0))
            {
              print fread($handel, min(1024 * 16, ($end - $cur) + 1));
              $cur += 1024 * 16;
            }
        }else{
            redirect(base_url().'track/faild');
        }
    }            
}



کد هارو اصلاح کردم تا رسیدم به اینجا که فایل تا 60-70 درصد دانلود میشه اما قطع میشه
resum هم نداره

$CI =& get_instance();
$CI->load->helper('func');
if($fileData !== false){
    $timeexpire = $fileData['time'];
    $now = time();
    $file = '';
    if($timeexpire < $now){
        redirect('download/time/2');
    }else{
        $url              = str_replace(" ","%20",$fileData['url']);
        $fileinfo = pathinfo($url);
        $mimType= ($fileinfo['extension'] == 'mp3') ? 'audio/mpeg' : 'txt';//set mime type to mp3
        $fileSize = curl_get_file_size($url);//get file size with curl
        $size= $fileSize;
        //$fileSize= formatSizeUnits($fileSize);//convert byte to MB for file size
        $foundCode = existfile($url);//check exists file or not and return 400 or 200         
        if($foundCode == 200){
           $handel        = @fopen($url,'r');
        }else{
             redirect(base_url().'track/faild'); 
        }                
        $begin    = 1;
        $end      = $fileSize ;
        $fileName = basename($url);               
        if (isset($_SERVER['HTTP_RANGE'])){
            if (preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
            {
                $begin  = intval($matches[1]);
                if (!empty($matches[2]))
                {
                  $end  = intval($matches[2]);
                }
            }
        }
        if (isset($_SERVER['HTTP_RANGE']))
        {
          header('HTTP/1.1 206 Partial Content');
        }
        else
        {
          header('HTTP/1.1 200 OK');
        }
        
        header("Content-Type: application/force-download");
        header('Cache-Control: public, must-revalidate, max-age=0');
        header('Pragma: no-cache');  
        header('Accept-Ranges: bytes');
        header('Content-Length:' . (($end - $begin) + 1));
        if (isset($_SERVER['HTTP_RANGE']))
        {

          header("Content-Range: bytes $begin-$end/$size");
        }
        header("Content-Disposition: attachment; filename=$fileName");
        header("Content-Transfer-Encoding: binary");
        $cur = 1;
        if($handel != NULL){
            while(!feof($handel) && $cur <= $end && (connection_status() == 0))
            {              
              fseek($handel,$cur,0);
              print fread($handel, $cur);
              $cur += 1024 * 16;
            }
            fclose($handel);
        }else{
            redirect(base_url()."track/faild");
        }
    }            
}


فایل دانلود میشه ولی اجرا نمیشه
هر وقت حل شد اصلاحش رو میزارم شاید بدرد دوستان بخوره


$CI =& get_instance();
$CI->load->helper('func');
if($fileData !== false){
    $timeexpire = $fileData['time'];
    $now = time();
    $file = '';
    if($timeexpire < $now){
        redirect('download/time/2');
    }else{
        $url              = str_replace(" ","%20",$fileData['url']);
        $fileinfo = pathinfo($url);
        $mimType= ($fileinfo['extension'] == 'mp3') ? 'audio/mpeg' : 'txt';//set mime type to mp3
        $fileSize = curl_get_file_size($url);//get file size with curl
        $size= $fileSize;
        //$fileSize= formatSizeUnits($fileSize);//convert byte to MB for file size
        $foundCode = existfile($url);//check exists file or not and return 400 or 200          
        if($foundCode == 200){
           $handel        = @fopen($url,'r');
        }else{
             redirect(base_url().'track/faild'); 
        }                
        $begin    = 1;
        $end      = $fileSize ;
        $fileName = basename($url);               
        if (isset($_SERVER['HTTP_RANGE'])){
            if (preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
            {
                $begin  = intval($matches[1]);
                if (!empty($matches[2]))
                {
                  $end  = intval($matches[2]);
                }
            }
        }
        if (isset($_SERVER['HTTP_RANGE']))
        {
          header('HTTP/1.1 206 Partial Content');
        }
        else
        {
          header('HTTP/1.1 200 OK');
        }
         
        header("Content-Type: $mimType");
        header('Cache-Control: public, must-revalidate, max-age=2000');  
        header('Accept-Ranges: bytes');
        header('Content-Length:' . (($end - $begin) + 1));
        if (isset($_SERVER['HTTP_RANGE']))
        {
          header("Content-Range: bytes $begin-$end/$size");
        }
        header("Content-Disposition: attachment; filename=$fileName");
        header("Content-Transfer-Encoding: binary");
        $cur = 1;
        if($handel != NULL){            
            fseek($handel,2000,$cur);
            while(!feof($handel) && $cur <= $end)
            {                             
                print fread($handel, $cur);
                $cur += 2000;
            }
        }else{
            redirect(base_url()."track/faild");
        }
    }            
}


توی اینترنت نمونه های زیادی هست :
https://gist.github.com/kosinix/4cf0d432638817888149
https://gist.github.com/fzerorubigd/3899077

اما در نهایت وقتی میخوای دانلود حرفه ای داشته باشی باید دانلود را بدی سرویس دهنده یعنی خود Apache یا Nginx برات انجا بده با همون x-sendfile که توی پست های بالا اشاره کردم اما سرویس VPS و در کل اختصاصی میخواد چون Shared Hosting ها عموما پشتیبانی نمیکنن.
بله اینا رو دیدم رو نت تقریبا همرو دیدم
درست میشه مشکلی نیست