首頁 > 後端開發 > php教程 > linux - php處理圖片下載報錯

linux - php處理圖片下載報錯

WBOY
發布: 2016-08-04 09:21:53
原創
1167 人瀏覽過

1 用戶點網站的下載二維碼連結時候, 伺服器取得微信產生的二維碼,然後下載到用戶電腦
同樣的代碼測試機沒問題,線上下來圖片打不開,
代碼如下

<code>
    public function download(){
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=xxxxxxxxxx";
        $tmp = file_get_contents($url);
        $file_name = "weixin.jpg";
       // 输入文件标签
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Accept-Length: ".strlen($tmp));
        Header("Content-Disposition: attachment; filename=" . $file_name);
        // 输出文件内容
        echo $tmp;
        exit();
  }</code>
登入後複製
登入後複製

已經基本確定是環境不同所導致的。
下載圖片這幾行程式碼,對伺服器配置,或安裝的軟體,有什麼要求嗎?


同樣的程式碼,在測試機上,下載的圖片是可以打開的,線上的機器,就打不開了

---------------------分隔線------------------------
經過偵測發現是線上引用的其它類別裡面有空白行輸出,(可能是bom頭,也可能是php程式碼的閉合符?> 後有空行)導致header之前有輸出,圖片打不開,檔案太多,實在是太難找了。
加上以下程式碼後,解決。

<code>//清除之前的输出,确保图片完整。
        ob_start();
        ob_end_flush();
        ob_end_clean();</code>
登入後複製
登入後複製

回覆內容:

1 用戶點網站的下載二維碼連結時候, 伺服器取得微信產生的二維碼,然後下載到用戶電腦
同樣的代碼測試機沒問題,線上下來圖片打不開,
代碼如下

<code>
    public function download(){
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=xxxxxxxxxx";
        $tmp = file_get_contents($url);
        $file_name = "weixin.jpg";
       // 输入文件标签
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Accept-Length: ".strlen($tmp));
        Header("Content-Disposition: attachment; filename=" . $file_name);
        // 输出文件内容
        echo $tmp;
        exit();
  }</code>
登入後複製
登入後複製

已經基本確定是環境不同所導致的。
下載圖片這幾行程式碼,對伺服器配置,或安裝的軟體,有什麼要求嗎?


同樣的程式碼,在測試機上,下載的圖片是可以打開的,線上的機器,就打不開了

---------------------分隔線------------------------
經過偵測發現是線上引用的其它類別裡面有空白行輸出,(可能是bom頭,也可能是php程式碼的閉合符?> 後有空行)導致header之前有輸出,圖片打不開,檔案太多,實在是太難找了。
加上以下程式碼後,解決。

<code>//清除之前的输出,确保图片完整。
        ob_start();
        ob_end_flush();
        ob_end_clean();</code>
登入後複製
登入後複製

我遇見過這個問題。我覺得錯誤是出在file_get_contents。你的url是https的,file_get_contents取會卡死的,試著用curl取代file_get_contents應該可以解決問題。
(curl中有2個ssl的設定能讓程式正常存取https,順帶一提, 這個應該都知道)

<code>   Header("Accept-Length: ".strlen($tmp));  不定义这个试试</code>
登入後複製

strlen
當遇見一個0的時候會認為已到達字符串結尾,而圖片的中間是可能出現0的,因此只是獲得了圖片的一部分數據,當然打不開了。
例如

<code>$hex='3332310033323131313131313131313131313131313131313131313131313131313131313131313131'
//结果是321,即0后面的都无效。</code>
登入後複製
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板