Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Скачка файлов с сервера


Автор: Serious2008 17.10.2011, 08:24
у меня возникла проблема при скачке файлов, в некоторых браузерах по разному себя вебудт с разными файлами, например pdf в опере не может нормально скачаться, не знает размер финальный. Я гуглил нашёл вот этот скрипт отдачи файла, он вообще пересылает и отдаёт страницу, это вообще не то.
Код

function download($url, $new_name=''){ 

    $openfile = @fopen($url, 'r'); 

    if (!$openfile){ 

        die('Файл не найден'); 

    }else{ 

        $fileinfo = stream_get_meta_data($openfile); 

        preg_match('#Content-Length:[\s\S](\d+)#is', join('', $fileinfo['wrapper_data']), $outsize); 
        $filesize = !empty($outsize[1]) ? $outsize[1] : ''; 
        preg_match('#Last-Modified:[\s\S](.+GMT)#Uis', join('', $fileinfo['wrapper_data']), $outmod); 
        $last_modifed = !empty($outmod[1]) ? $outmod[1] : ''; 
        preg_match('#Content-Type:[\s\S](.*)\s#U', join(' ', $fileinfo['wrapper_data']), $outmime); 
        $mime_type = !empty($outmime[1]) ? $outmime[1] : ''; 
        fclose($openfile); 

        $etag = md5($filename); 
        $etag = substr($etag, 0, 8).'-'.substr($etag, 8, 7).'-'.substr($etag, 15, 8); 

        header('HTTP/1.1 200 Ok'); 
        header('Content-Length: '.$filesize); 
        header('ETag: "'.$etag .'"'); 
        header('Accept-Ranges: bytes'); 
        header('Connection: close'); 
        header('Content-Type: '.$mime_type); 
        header('Last-Modified: '.$last_modifed); 
        header('Content-Disposition: attachment; filename="'.$new_name.'";'); 

        echo readfile($filename); 

    } 
} 


Автор: $дмитрий 17.10.2011, 15:36
Из старого проекта
Код

$arFile['TIME'] = filemtime($arFile['PATH']);
$arFile['SIZE'] = filesize($arFile['PATH']);
$arFile['MIME'] = 'application/octet-stream';
$rFile = fopen($arFile['PATH'], "rb");


if(isset($_SERVER['HTTP_RANGE'])){
    preg_match ("/bytes=(\d+)-/", $_SERVER['HTTP_RANGE'], $arMath);
    $nRange = $arFile['SIZE'] - (int)$arMath[1];
    fseek($rFile, ($arFile['SIZE'] - $nRange));

    header('HTTP/1.1 206 Partial Content');
    header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T' , filemtime($arFile['TIME'])));
    header('Cache-Control: None');
    header('Pragma: no-cache');
    header('Accept-Ranges: bytes');
    header('Content-Disposition: attachment; filename="'.$arFile['NAME'].'"');
    header('Content-Range: bytes '.($arFile['SIZE'] - $nRange).'-'.($arFile['SIZE'] - 1).'/'. $arFile['SIZE']);
    header('Content-Length: '.$nRange);
    header('Content-Type: '.$arFile['MIME']);
    header('Proxy-Connection: close');
    header('');

    fpassthru($rFile);
    fclose($rFile);
}else{
    header('HTTP/1.1 200 OK');
    header('Cache-Control: None');
    header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T' , $arFile['TIME']));
    header('Pragma: no-cache');
    header('Accept-Ranges: bytes');
    header('Content-Disposition: attachment; filename="'.$arFile['NAME'].'"');
    header('Content-Length: '.$arFile['SIZE']);
    header('Content-Type: '.$arFile['MIME']);
    header('Proxy-Connection: close');
    header('');
    fpassthru($rFile);
    fclose($rFile);
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)