todo:大文件下载的一个例子

发布于 2024-11-13 19:19:34

附件下载显示下载的名称。
通过附件表fa_attachment 的url去查出中文

//需求附件的名称
$reqattachement_url = $archives["reqattachment"];
if($reqattachement_url !="" && $reqattachement_url != null){
    $reqattachement = Attachment::where("url",$reqattachement_url)->find();
    if($reqattachement){
        $reqattachement_filename = $reqattachement["filename"];
        $this->view->assign("__reqattachement_filename__", $reqattachement_filename);
    }else{
        $this->view->assign("__reqattachement_filename__", "");
    }
}
//下载需求附件--需求方上次
    public function downloadReqattachmentFile()
    {
        $fileaddress = $this->request->param("fileaddress");//订单附件表的ID
        if (!$fileaddress) {
            $this->error(__('Operation failed'));
        }

        //需求附件的名称
        $reqattachement_filename="match";
        
        
        $reqattachement = Attachment::where("url",$fileaddress)->find();
        if($reqattachement){
            $reqattachement_filename = $reqattachement["filename"];
             
        }            
       

        //$obj = $this->download_db_log_api($id) ;
        $sourcefile = $fileaddress;
        $title = $reqattachement_filename;


        //下载,返回下载路径。
        $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';   

        $http_front = $http_type.$_SERVER['HTTP_HOST'];        
        $sourcefileUrl = $http_front.$sourcefile; 

        $filePath =  $_SERVER['DOCUMENT_ROOT'].$sourcefile;  
        //$postfix=strrchr($filePath, '.');
        $fileName = $title;
        
        //begin add 20211226 解决大文件下载报错的问题,file_get_contents($filePath)这个方式不行。
        set_time_limit(0);    
        $filesize = filesize($filePath);

        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Transfer-Encoding: binary');
        header('Accept-Ranges: bytes');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . $filesize);
        header('Content-Disposition: attachment; filename=' . $fileName);
     
        // 打开文件
        $fp = fopen($filePath, 'rb');
        // 设置指针位置
        fseek($fp, 0);
     
        // 开启缓冲区
        //ob_start();
        // 分段读取文件
        while (!feof($fp)) {
            $chunk_size = 1024 * 1024 * 2; // 2MB
            echo fread($fp, $chunk_size);
            ob_flush(); // 刷新PHP缓冲区到Web服务器
            flush(); // 刷新Web服务器缓冲区到浏览器
           // sleep(1); // 每1秒 下载 2 MB
        }
        // 关闭缓冲区
        //ob_end_clean();
        fclose($fp);


    }
0 条评论

发布
问题