رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
اضافه کردن resum برای دانلود
#1
برای اینکه فایلی که میزاریم برای دانلود قابلیت resum داشته باشه چه کاری باید انجام بشه؟
پاسخ
تشکر شده توسط:
#2
درمورد تنظیم هدرهای HTTP-Range تحقیق کنید.
پاسخ
تشکر شده توسط: sm_pakdel
#3
البته بهتره دانلود را از طریق mod_xsendfile بدیم دست Apache و مدیریت ارسال را خود سرور انجام بده.
اگه کسی گفت با ۱۰۰ هزار تومان برات سایت درست میکنه بزن تو گوشش ،‌ شاید تو ندونی برای چی اما اون خوب میدونه !
پاسخ
تشکر شده توسط:
#4
(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"); 


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

   
پاسخ
تشکر شده توسط:
#6
فکر میکردم باید با fseek هربار که میخونم فایلو ادامشو بگیرم نیاد از اول
ولی اینم استفاده میکنم این ارورو میده stream does not support seeking
پاسخ
تشکر شده توسط:
#7
دوستان کسی راهی به ذهنش نمیرسه من کل کد هارو از کنترلر اوردم تو 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');
        }
    }            
}



پاسخ
تشکر شده توسط:
#8
کد هارو اصلاح کردم تا رسیدم به اینجا که فایل تا 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");
        }
    }            
}


پاسخ
تشکر شده توسط:
#9
فایل دانلود میشه ولی اجرا نمیشه
هر وقت حل شد اصلاحش رو میزارم شاید بدرد دوستان بخوره


$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");
        }
    }            
}


پاسخ
تشکر شده توسط:
#10
توی اینترنت نمونه های زیادی هست :
https://gist.github.com/kosinix/4cf0d432638817888149
https://gist.github.com/fzerorubigd/3899077

اما در نهایت وقتی میخوای دانلود حرفه ای داشته باشی باید دانلود را بدی سرویس دهنده یعنی خود Apache یا Nginx برات انجا بده با همون x-sendfile که توی پست های بالا اشاره کردم اما سرویس VPS و در کل اختصاصی میخواد چون Shared Hosting ها عموما پشتیبانی نمیکنن.
اگه کسی گفت با ۱۰۰ هزار تومان برات سایت درست میکنه بزن تو گوشش ،‌ شاید تو ندونی برای چی اما اون خوب میدونه !
پاسخ
تشکر شده توسط: sm_pakdel
#11
بله اینا رو دیدم رو نت تقریبا همرو دیدم
درست میشه مشکلی نیست
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 3 مهمان