有個大坑:在phpqrcode類里QRimage::png會重新定義header為header('content-type : img/png')
此header頭解析不了html代碼,所以在返回完后直接是一張二維碼別的代碼起不了任何作用,所以要返回完之后再重新聲明一下header為header('Content-Type:text/html;charset=utf-8');,我在下邊代碼中聲名過了,標紅的就是
1.引入phpqrcode類(php操作二維碼類)
2.調用encodePNG方法
3.修改encodePNG方法( 加入ob緩存,返回)base64加密后的圖片流
4.將加密后的圖片流返回給前端
5.前端通過img標簽輸出
6.下載功能:超鏈接直接加上 download="圖片名稱"
調用phpqrcode代碼如下
/** * 活動二維碼生成 * @param $text 參數$text表示生成二位的的信息文本; * @param $outfile 參數$outfile表示是否輸出二維碼圖片 文件,默認否; * @param string $level 參數$level表示容錯率,也就是有被覆蓋的區域還能識別,分別是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%); * @param int $size 參數$size表示生成圖片大小,默認是3;參數$margin表示二維碼周圍邊框空白區域間距值; * @param int $margin * @param bool $saveandprint 參數$saveandprint表示是否保存二維碼并顯示。 */ include_once(ROOT_PATH . '/protected/components/phpqrcode.php'); $link = LinkUrlHelper::getUrl(Yii::app()->user->eid,'ACTIVE_DETAIL',$id); $h5Url = $link['h5']; $baseImg = QRimage::encodePNG($h5Url,false); $this->renderPartial('training_code',['img'=>$baseImg]);
修改后的encodePNG方法
public function encodePNG($intext, $outfile = false,$saveandprint=false) { try { ob_start(); $tab = $this->encode($intext); $err = ob_get_contents(); ob_end_clean(); if ($err != '') QRtools::log($outfile, $err); $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); ob_start();//開啟ob緩存 QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); $imageString = base64_encode(ob_get_contents());//將圖片流存入緩存并加密賦值給變量 ob_end_clean();//清楚ob緩存 header('Content-Type:text/html;charset=utf-8');// QRimage::png 會覆蓋此header頭,所以要重新聲明一下,否則解析不了html代碼。 return "data:image/png;base64,".$imageString;//返回拼接好的串 } catch (Exception $e) { QRtools::log($outfile, $e->getMessage()); } }
總結
以上所述是小編給大家介紹的php生成二維碼不保存服務器還有下載功能的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!