برای اینکه فایلی که میزاریم برای دانلود قابلیت resum داشته باشه چه کاری باید انجام بشه؟
رتبه موضوع:
اضافه کردن resum برای دانلود
|
09-03-1396، 11:13 ب.ظ
البته بهتره دانلود را از طریق mod_xsendfile بدیم دست Apache و مدیریت ارسال را خود سرور انجام بده.
اگه کسی گفت با ۱۰۰ هزار تومان برات سایت درست میکنه بزن تو گوشش ، شاید تو ندونی برای چی اما اون خوب میدونه !
26-03-1396، 01:56 ق.ظ
(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");
26-03-1396، 05:54 ب.ظ
فکر میکردم باید با fseek هربار که میخونم فایلو ادامشو بگیرم نیاد از اول
ولی اینم استفاده میکنم این ارورو میده stream does not support seeking
27-03-1396، 02:33 ق.ظ
دوستان کسی راهی به ذهنش نمیرسه من کل کد هارو از کنترلر اوردم تو 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'); } } }
27-03-1396، 05:58 ب.ظ
کد هارو اصلاح کردم تا رسیدم به اینجا که فایل تا 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"); } } }
30-03-1396، 01:10 ق.ظ
توی اینترنت نمونه های زیادی هست :
https://gist.github.com/kosinix/4cf0d432638817888149 https://gist.github.com/fzerorubigd/3899077 اما در نهایت وقتی میخوای دانلود حرفه ای داشته باشی باید دانلود را بدی سرویس دهنده یعنی خود Apache یا Nginx برات انجا بده با همون x-sendfile که توی پست های بالا اشاره کردم اما سرویس VPS و در کل اختصاصی میخواد چون Shared Hosting ها عموما پشتیبانی نمیکنن.
اگه کسی گفت با ۱۰۰ هزار تومان برات سایت درست میکنه بزن تو گوشش ، شاید تو ندونی برای چی اما اون خوب میدونه !
تشکر شده توسط: sm_pakdel
|
|
کاربران در حال بازدید این موضوع: 3 مهمان