Post view

解決BOONEX DolphinPro 7.3.3使用Regular普通上傳照片,會覆寫Uri網址、Tags、描述的問題

在「上傳照片」時,如果「使用Regular普通上傳照片,會覆寫Uri網址、Tags、描述的問題」這並不是目前最新版本DolphinPro 7.3.3才有的問題,而是在很久以前就已經有的老舊問題!

從insoler網站一開始架設到現在的老舊問題!簡單的說,這個問題是早在Dolphin-v.7.1.6甚至是Dolphin-v.7.0.9就有的老舊問題。但因為使用各種方式,還是一直找不到有這種Bug的程式碼,一直拖到這幾天才終於解決了!事實上,我剛開始使用Dolphin-v.7.1.6架設insoler網站的時候,對Dolphin這套網站系統的程式碼結構還不是很了解,一邊經營網站,一邊持續了解Dolphin的PHP程式架構。

直到最近才想到「使用Regular普通上傳照片,會覆寫Uri網址、Tags、描述的問題」的這個Bug很可能不是出在Photos模組裡面,而是出在其他地方!因為我已經非常熟悉Photos模組了,所以這個Bug絕對是發生在其他地方!但問題是,這樣的Bug的程式碼到底是寫在哪裡?

通常,我不會把修正Dolphin的程式碼公開出來說明、討論。不是因為不可以「公開程式碼」,而是寫一篇文章,圖文並茂說明並沒有任何意義!不會有其他「站長」對Dolphin有興趣。寫出如何修正Dolphin的Bug、問題點,也沒人想要看。

在DolphinPro上傳照片時,會看到類似這樣的畫面。預設是使用新的「Multi-Uploader」多檔案上傳方式。這個方式是直接使用HTML 5來完成。

boonex-dolphin733-photos001.jpg

但是對於某些不支援HTML 5、對於HTML 5的支援不完全的瀏覽器,可能會遇到「無法上傳照片」的問題。這時候就只能改用「Regular普通上傳」的方式。 

boonex-dolphin733-photos002.jpg

不過「Regular」普通上傳並不好用,而且按「Select File」每次只能選取一張想要上傳的照片。更奇怪的是,還要點選「I have the right to distribute these photos」這個選項。在「Multi-Uploader」多檔案上傳不須要點選這種選項。

boonex-dolphin733-photos003.jpg

按一下「Select File」選取一張要上傳的照片以後,不會顯示將要上傳的檔案名稱(在還沒有上傳照片之前,當然也無法預覽要上傳的照片縮圖),這也是一個必須要解決的Bug。

按下「Continue繼續」之後,就會正式上傳選取的那一張寫真,這時候才會看到上傳的照片的檔案名稱。另外還可以在這裡輸入Tags標籤、Description描述、Categories類別。

boonex-dolphin733-photos004.jpg

也可以完全不理會Tags標籤、Description描述、Categories類別, 就這樣保持空白,直接按「Submit送出」就行了。甚至是根本不用理會「Submit」直接按insoler網頁最上面的「Home」回到insoler首頁,中斷後續的「Submit」動作即可。但是,我直到最近才發現,原來問題就是出在這裡!sigh

事實上,在前面按下「Continue繼續」之後,就會開始上傳照片,上傳完畢之後,根本就不需要針對每一張照片,一一各別輸入「Tags標籤、Description描述、Categories類別」!多了這個動作,不管user有沒有輸入,就算保持空白,直接按按「Submit」送出,DolphinPro系統,竟然會認為是「輸入空白」反而清除原本在「相簿」裡面預設的「Tags標籤、Description描述」,甚至重新設定「上傳照片的Uri網址」!導致在這個步驟上出了嚴重的問題!cant

在這個畫面,暫時先不要按下「Submit送出」,先看一下「資料庫」內容,就會知道按下「Submit送出」之前的資料庫是完全正常的!然而,一但按下「Submit送出」之後,就會出錯了!cant

boonex-dolphin733-photos005.jpg

這個問題從網站上很難發現,比較能察覺的是上傳的照片網址,在正常的情況下,最後應該是「14798326307856」 之類的時間流水編號(這個數字其實是PHP將「現在時間」轉換成一組連續數字的結果)。但是使用「Regular」普通上傳、「Continue繼續」「Submit」之後,照片的網址會變成「IMG_5194」之類的網址,導致會有其他新的Bug。

因為從網站上很難發現,直接使用phpMyAdmin來看一下Dolphin資料庫裡面的「bx_photos_mail」資料表裡面儲存的資料就會更「一目瞭然」!在「Uri」的照片網址欄位,看到的「14798326307856」 之類的時間流水編號是「正常的網址」,如果「Uri」看到的是「IMG_4868」之類的照片檔案名稱,就是「錯誤的網址」!sigh

boonex-dolphin733-photos006.jpg

那麼,倒底是什麼原因會導致「Uri」網址有「14798326307856」與「IMG_4868」兩種網址?其實非常簡單:

・使用「Multi-Uploader」多檔案上傳方式,照片的「Uri」網址就會是正常的「14798326307856」時間流水編號。

・使用「Regular」普通上傳方式,照片的「Uri」網址就會變成錯誤的「IMG_4868」檔案名稱網址。

boonex-dolphin733-photos007.jpg

在前面上傳照片的畫面,暫時先不要按下「Submit送出」,在資料庫裡面看到的「Uri」會是正確的「14798326307856」時間流水編號,然而一但「Submit」之後,就會被「某一段程式碼」改成錯誤的「IMG_4868」檔案名稱的網址!

我的問題其實就是出在這裡!因為我直到最近才發現按下「Submit」按鈕之後,資料庫資料的「Uri」內容差異!另外一個問題是,按下「Submit」按鈕之後,到底PHP是執行了哪些程式碼,才會導致有這個Bug問題?

boonex-dolphin733-photos008.jpg

我已經修正好這個Bug問題點!因此,現在如果user不想輸入Tags標籤、Description描述、Categories類別的內容,直接按「Submit」按鈕的話,不但「Uri」不會被變更成「IMG_4868」錯誤的檔案名稱網址

對於「網址」「伺服器」與「網站」系統不了解的人,可能不知道「網址」是「IMG_4868」會有什麼不對?不好?undecided其實這絕對不是「網址」不能使用檔案名稱,而是直接使用「檔案名稱」會造成更多問題!請試著想一下,在Facebook上,全球有10億user,如果有很多人拍的照片的檔案名稱,剛剛好都是相同的「IMG_4868」的時候(當然「同名同姓」的人也會很多,當然不能用「姓名」來當作網址的識別方式),照片的網址卻都是「IMG_4868」的話,到底網址的上面的「IMG_4868」是誰拍的照片?就會無法區分了!

也因此,對於大型網站來說,網址不能使用真實的「IMG_4868」檔案名稱、user真實的姓名等,必須改用絕對不會重複的「流水編號」這是基本常識。即使是Facebook也不可能例外!但一般人很少留意「網址」的內容。當然也導致容易被想要做壞事的駭客「釣魚」「詐騙」。

修正好這個Bug以後,不輸入Tags標籤、Description描述、Categories類別的話,就不會改變任何資料表的內容!但如果user想要輸入「Tags標籤、Description描述」的話?

boonex-dolphin733-photos009.jpg

按下「Submit」按鈕才能看到上傳的照片縮圖。這是使用「Regular普通上傳」最大的缺點。但這個缺點不是因為「網站」!而是因為「HTML 4瀏覽器」版本老舊,以前舊版的瀏覽器,無法在上傳照片時,先預覽要上傳的照片縮圖!只能靠「Flash」寫程式來處理額外的動作,但因為「Flash」幾乎有修正不完的「安全性漏洞」,程式碼本身非常的龐大,造成電腦CPU處理上的負擔,更造成「智慧型手機」無法順暢的運作,所以現在新的網站系統都不使用Flash,而是改用新一代的HTML 5來解決Flash帶來的各種問題。 

boonex-dolphin733-photos010.jpg

按下「Submit」送出之後,再重新載入一次資料庫網頁,就會看到「Desc」與「Tags」這兩個欄位的資料有更新,其他的則是保持原本的「預設值」(預設值是在「新增相簿」的時候設定)。

boonex-dolphin733-photos011.jpg

就算知道按下「Submit」送出之後,資料庫會被「錯誤變更」的這個問題、現象,不知道是哪一段PHP程式碼造成的,還是無法解決問題!事實上,光是為了找到Bug,就花了非常多的時間!至少超過「一年」以上!

甚至在Photos模組裡面的「function performPhotoUpload」執行照片上傳的副程式裡面,加入這段我寫的程式碼,用來追蹤「呼叫副程式的歷程」:

		$SubProgInfo = debug_backtrace();

$bnwarr = print_r($SubProgInfo, true);

$this->echofile($bnwarr);

也就是利用「debug_backtrace()」這個函式,從一開始進入模組的第一個「modules/index.php」到最後的(反而會是[0] => Array)的「PhotosUploader.php」函式儲存在陣列變數裡面。

因為無法將陣列變數內容直接顯示在網頁上(就算可以,也會因為輸出資料太多,反而有看沒有懂),所以改儲存在「字串」然後把「字串」內容儲存在「檔案」裡面。底下只是截取非常小的一部分內容。

    [0] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/modules/boonex/photos/classes/PhotosUploader.php

            [line] => 242:if (!($iMID = $this->performPhotoUpload($sFilePath, $aInfo, false, $isMoveUploadedFile)))

            [function] => performPhotoUpload

            [class] => BxPhotosUploader

            [object] => BxPhotosUploader Object

                    [sTempFilename] => IMG_4862

    [1] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolFilesUploader.php

            [line] => 928:$a = $this->performUpload ($sFilePath, $sRealFilename, array(), $isMoveUploadedFile, $aExtraParams);

            [function] => performUpload

            [class] => BxPhotosUploader

            [object] => BxPhotosUploader Object

    [2] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolFilesUploader.php

            [line] => 879:$sResult .= $this->_shareFile($_FILES['file']['tmp_name'][$i], true, $_FILES['file']['name'][$i], array('file_type' => $_FILES['file']['type'][$i]));

            [function] => _shareFile

            [class] => BxDolFilesUploader

            [object] => BxPhotosUploader Object

    [3] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolFilesUploader.php

            [line] => 861:$sCode = $this->{$r['handle']}();

            [function] => serviceAcceptFile

            [class] => BxDolFilesUploader

            [object] => BxPhotosUploader Object

    [4] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolFilesModule.php

            [line] => 1474:$sCode = $oUploader->serviceAcceptUpload($sAction); 使用「Regular」方式上傳!

            [function] => serviceAcceptUpload

            [class] => BxDolFilesUploader

            [object] => BxPhotosUploader Object

    [5] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolFilesModule.php

            [line] => 725:$this->processUpload($oUploader, $sAction);

            [function] => processUpload

            [class] => BxDolFilesModule

            [object] => BxPhotosModule Object

    [6] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolFilesModule.php

            [line] => 678:$this->actionAlbumsViewMy($sParamValue, $sParamValue1, $sParamValue2, $sParamValue3);

            [function] => actionAlbumsViewMy

            [class] => BxDolFilesModule

            [object] => BxPhotosModule Object

    [7] => Array

            [function] => actionAlbums

            [class] => BxDolFilesModule

            [object] => BxPhotosModule Object

    [8] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolRequest.php

            [line] => 96:return call_user_func_array(array($oModule, $sMethod), $aParams);

            [function] => call_user_func_array

            [args] => Array

    [9] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/inc/classes/BxDolRequest.php

            [line] => 42:$mixedRet = BxDolRequest::_perform($aModule, $sClass, $sMethod, $aRequest);

            [function] => _perform

            [class] => BxDolRequest

            [type] => ::

            [args] => Array

    [10] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/modules/boonex/photos/request.php

            [line] => 12:BxDolRequest::processAsAction($GLOBALS['aModule'], $GLOBALS['aRequest']);

            [function] => processAsAction

            [class] => BxDolRequest

            [type] => ::

            [args] => Array

    [11] => Array

            [file] => /Library/Server/Web/Data/Sites/www.brentsu.com/dolphin/modules/index.php

            [line] => 24:include(BX_DIRECTORY_PATH_MODULES . $GLOBALS['aModule']['path'] . 'request.php');

            [args] => Array

            [function] => include

 

看完「debug_backtrace()」追蹤的副程式執行順序,就能找到問題點?運氣好的話,可能可以。但運氣不好的話,很可能只是白費力氣。在這裡是完全的「白浪費時間」!因為出問題的地方不是上傳照片的「function performPhotoUpload」副程式!但因為一直認為問題是出在Photos裡面,所以白花了很多時間在這裡!甚至超過一年!

直到最近這一兩個星期才發現,真正的問題是出在按「Continue」上傳照片之後,如果繼續按下「Submit」按鈕,就會被覆蓋掉一些資料表欄位,包括Categories、Tags、Desc、Uri。但是按下「Submit」按鈕,又執行了哪些副程式?這又要花很多時間研究...

花了許多時間之後,終於找到真正的問題是出在「inc/BxDolFilesUploader.php」的「function initFile」副程式!這個副程式用來設定Categories、medTitle、medTags、medDesc、medUri。

其實這個副程式本身並沒有任何「Bug」!真正的問題是「副程式的用法」!在上傳照片完畢之後,原本就不應該還要user輸入每一張照片的Categories、Tag、Desc才對!也就是不管是使用「Multi-Uploader」或是「Regular」都應該有類似的上傳流程。只是差別在「Multi-Uploader」可以一次選取多張照片,一次上傳許多張照片,而「Regular」一次只能選取一張照片,上傳幾張照片。不應該有其他的動作才對!

猜想剛開始的時候,原本只有「Regular」,後來新增「Flash」方式,事實上這時候就出問題了!但是在HTML 5發表之後,廢除「Flash」程式,改成「Multi-Uploader」而已,因此問題並不是出在「function performPhotoUpload」,而是出在原本只有「Regular」的部分!

這是目前DolphinPro 7.3.3在「inc/classes/BxDolFilesUploader.php」的「function initFile」副程式的原始程式碼:

    function initFile($iMedID, $sTitle, $sCategories = '', $sTags = '', $sDesc = '', $aCustom = array())
    {
        $sMedUri = uriGenerate($sTitle, $this->oModule->_oDb->sFileTable, $this->oModule->_oDb->aFileFields['medUri']);

        $aFields = array('Categories'=>$sCategories, 'medTitle'=>$sTitle, 'medTags'=>$sTags, 'medDesc'=>$sDesc, 'medUri'=>$sMedUri);
        if ($aCustom)
            $aFields = array_merge($aFields, $aCustom);

        $bRes = $this->oModule->_oDb->updateData($iMedID, $aFields);

        if ($bRes) {
            $oTag = new BxDolTags();
            $oTag->reparseObjTags($this->oModule->_oConfig->sPrefix, $iMedID);
            $oCateg = new BxDolCategories();
            $oCateg->reparseObjTags($this->oModule->_oConfig->sPrefix, $iMedID);
        }

        return $bRes;
    }

 

這是我修改好的程式碼: 

boonex-dolphin733-photos012.jpg看得懂PHP的讀者應該會知道已經不再處理「medUri」!因為「Submit」按鈕的網頁表單上也只有Categories、medTitle、medTags、medDesc這4個項目。如果上傳照片後,user沒有輸入任何資料,不應該被當作「 '' 」的空白字串!反而清除Categories、Tags、Desc資料表的內容!應該是user沒有輸入任何資料,就不要變更資料庫內容。這樣才合理!

即使insoler的「相片」模組沒有限定「相簿容量」的功能,可說是每個會員都有「無限容量的相簿」,甚至還支援「直接上傳RAW照片」功能,但因為經常使用相簿的會員也只有1-2個會員而已,因此這個經過1-2年才終於修正的Bug,也幾乎沒有影響到任何會員。

蘇言霖 2016/11/24 0 1031
Comments
Order by: 
Per page:
 
  • There are no comments yet
Rate
0 votes
Post info
蘇言霖
「超級懶貓級」社群網站站長
2016/11/24 (2878 days ago)
Actions