2014年5月15日 星期四

Opencart - 含中文檔名的圖片上傳後無法顯示 ( CKEditor )

如果 opencart 架在Windows上面,把中文檔名的圖片丟到網頁資料夾,然後在後台要設定產品圖片,或是在文章管理那邊使用文字編輯器 (CKEditor)選擇圖片,會發現圖片通通都不見了。

這是編碼問題。丟到網頁資料夾裡面的檔案名稱,應該是 big5 編碼。Windows至今還是不把 utf8(unicode) 設為預設值。但是 CKEditor 好像不支援 big5。

網路上找了一會兒還沒看到解法。突然想起來之前使用 PHPExcel 也發生過類似的問題( PHPExcel - 中文檔名與路徑的問題 ) ~~ 我怎麼想那麼久。不過網路上怎麼沒什麼人講。大概是我關鍵字下的不好?這兩個問題不完全一樣,不過都是檔名的編碼問題。(是檔名,不是檔案的內容)

PHPExcel 那邊的問題是,要把報價單存成 excel ,並以客戶名稱做為檔名。但是資料庫使用 UTF-8 編碼,使用者瀏覽網頁是沒問題,但是要把匯出來的檔案以客戶名稱命名,檔名就有可能出現亂碼。這是因為在成中文檔名的時候,Windows 會使用 Big5 碼儲存(或者說是 ASCII ?) 這時候決定採用哪種編碼的是 Windows,而不是瀏覽器。所以就算把瀏覽器的編碼改成 UTF-8 也沒用。解法是把檔名變數使用iconf, utf8轉成big5,然後Windows就可以使用這個big5的字串去給檔案命名。

Opencart 這邊流程上顛倒。圖片的中文檔名是 Big5。但是網頁是 UTF-8,所以網頁要去讀圖片時,不認得那些big5的檔名。這時候就算把瀏覽器改成 Big5 也沒用,更糟。因為 Opencart 是 UTF-8,如果把瀏覽器改成 Big5,就不只是 CKEditor看不到圖片,整個頁面都是亂碼。圖片(Big5) => Opencart(UTF-8) => 瀏覽器(Big5) 。

解決方式:
瀏覽器不要動,維持自動偵測。 Opencart 會告訴瀏覽器用 UTF-8。在 html 的 head 裡面有這一行 <meta charset="UTF-8" /> 。

Opencart 在儲存的時候,把 UTF-8 的檔名,透過 php 的 iconv 函數,轉成 Big5 。如下。

opencart 版本:v1.5.6.1

檔案
/admin/controller/common/filemanager.php

找到這一段
                    $json[] = array(
                        'filename' => basename($file),
                        'file'     => utf8_substr($file, utf8_strlen(DIR_IMAGE . 'data/')),
                        'size'     => round(utf8_substr($size, 0, utf8_strpos($size, '.') + 4), 2) . $suffix[$i]
                    );

在它前面插入一段:
                    //判斷是否是 Windows。如果是,把 big5 檔名轉成utf8檔名。
                    $agent = $_SERVER['HTTP_USER_AGENT'];
                    if(preg_match("/Windows/",$agent)){
                        $filename = iconv('Big5','UTF-8',basename($file));
                    }else{
                        $filename = basename($file);
                    }

                    $json[] = array(
                        'filename' => $filename ,
                        'file'     => utf8_substr($file, utf8_strlen(DIR_IMAGE . 'data/')),
                        'size'     => round(utf8_substr($size, 0, utf8_strpos($size, '.') + 4), 2) . $suffix[$i]
                    );

這個問題其實可以避免。這個問題會發生是因為現在這個站台是架在自己電腦上測試,而我的作業系統是 Windows。將來正式的站台如果放到 Linux 上面,統一採用 utf8 編碼,應該不會有這個問題。



沒有留言:

張貼留言