Assalomu alaykum, yordam.uz saytimizga xush kelibsiz.
Bu saytda o`zingizni qiziqtirgan savollarga javob olishingiz va o`z sohangiz bo`yicha savollarga javob berishingiz mumkin. Bizning Oilamizga a'zo bo`lganingiz uchun chuqur Minnatdorchilik bildiramiz !!!

PHP da yozilgan API dan foydalanib file download qilish

+6 ovoz
119 marta ko‘rilgan
so‘radi 22 noyabr, 17 Sardor Dushamov (1,683 bal)

Yii1 da API yozayotgan edim. File download qilish apisini qilishim kerak. Hozir bitta API qilganman, u ishlayapti muammosiz. Hozirgisi pastdagidek qilganman.

        header("Content-Disposition: attachment; filename=$public_name;");
        header("Content-Type: $mime_type");
        header('Content-Length: ' . filesize($filePath));

        $fp = fopen($filePath, 'rb');
        fpassthru($fp);

Telegramda ko'rgan bo'lsangiz kerak.

Masalan:

- biror 10 MB lik faylni download qilishga bersangiz;

- 50 % download qilganidan keyin stop qilsangiz;

- va yana download qilishga bossangiz;

kelgan joyidan, yani 51-foizdan boshlab ko'chirishni davom ettiradi. Qaytadan boshidan ko'chirmaydi.

Men buni serverdan bayt ko'rinishida yoki kilobayt ko'rinishida download qilsa kerak deb o'ylayapman.

Ya'ni :

1) 10*1024 = 10240 Kilobayt bo'ladi. 

2) Endi shuni 128 bo'lakka bo'lsak, 80 KB dan bo'ladi har bir bo'lak.

 3) client 128 marta zapros beradi.

4)  1-zapros 0-80 kb gacha

2-zapros 81-160 kb gacha 

....

10161 - 10240 kb gacha. Shunda hammasini qo'shsa 10MB fayl kelib chiqadi.

agar clientda uzilish bo'lsa nechinchi bo'lakda uzilgan bo'lsa o'sha bo'lakdan boshlab zapros berishni davom etadi.

Bu man o'ylaganim. Lekin buni qanday amalga oshirilishi yaxshi bilmayman, ya'ni client 80kb lab olib hammasini qanday 1 ta faylga jamlaydi va hkzo larni. 

Men ham shunday telegramdagidek ishlashi uchun  API qilmoqchi edim. 

Shunga kimdir bu ishni oldin qilib ko'rgan bo'lsa yordam berib yuboringlar.  O'zim ham streaming qilib download qilishni experiment qilayotgan edim, lekin hali kutilgan natijaga erishmadim.

1 ta javob

+5 ovoz
javob berdi 23 noyabr, 17 Sardor Dushamov (1,683 bal)
tanlangan 23 noyabr, 17 vejon
 
Eng yaxshi javob

Buni yechimi topildi va u quyidagicha:

Serverga client so'rov yuborganida "Header" qismida "Range" attributini yuboradi.

Range:bytes=1020-2048

yuqorida faylning 1020-baytidan 2048- baytigacha bo'lgan qismini yuboradi. 

2048-1024 = 1024 bayt=1kb degani.

Biz Range ga xohlagan intervalda qiymat berishimiz mumkin, faqat faylning umumiy baytlar sonidan oshib ketmasa bo'ldi.

$size = filesize($filePath);
$ctype = 'application/octet-stream';
if (isset($_SERVER['HTTP_RANGE'])) {
    list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2);
    if ($size_unit == 'bytes') {
        list($range, $extra_ranges) = explode(',', $range_orig, 2);
    } else {
        $range = '';
    }
} else {
    $range = '';
}

list($seek_start, $seek_end) = explode('-', $range, 2);

$seek_end = (empty($seek_end)) ? ($size - 1) : min(abs(intval($seek_end)), ($size - 1));
$seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)), 0);
$checksum = md5_file($filePath);
if ($seek_start > 0 || $seek_end < ($size - 1)) {
    header('HTTP/1.1 206 Partial Content');
}
header('Accept-Ranges: bytes');
header('Content-Range: bytes ' . $seek_start . '-' . $seek_end . '/' . $size);
header('Content-Type: ' . $ctype);
header("Content-Disposition: attachment; filename=$public_name;");
header('Content-Length: ' . ($seek_end - $seek_start + 1));
header("md5: $checksum");
//open the file
$fp = fopen($filePath, 'rb');
//seek to start of missing part
fseek($fp, $seek_start);
while (!feof($fp)) {
    set_time_limit(0);
    print(fread($fp, 1024 * 8));
    flush();
    ob_flush();
}
fclose($fp);
exit;

Assalomu alaykum, yordam.uz saytimizga xush kelibsiz.

Bu saytda o`zingizni qiziqtirgan savollarga javob olishingiz va o`z sohangiz bo`yicha savollarga javob berishingiz mumkin.

Bizning Oilamizga a'zo bo`lganingiz uchun chuqur Minnatdorchilik bildiramiz !!!

Telegram kanal YordamUzRss

...