跳到主要內容

發表文章

php多檔上傳檢測檔案類型MIME白名單的方法-教學撰寫:徐嘉裕Neil hsu

通常要檢測上傳檔案白名單可以用副檔名來檢測,不過副檔名是可以變造的,最常見的就是勒索病毒,比較安全的方法用上傳檔案的MIME來檢測,這樣就算變造過的副檔名一樣會被檢測出來,防止伺服器被駭,方法如下: foreach($_FILES['fileval']['tmp_name'] as $i=> $val){ //檢測文件的 MIME 內容類型 $mime_type = mime_content_type($val); //可上傳MIME類型JPG,PNG,GIF,Word,Excel,PowerPoint,pdf //可再增加MIME類型 $allowed_file_types = ['image/png', 'image/jpeg','image/gif','application/msword','application/vnd.ms-excel','application/vnd.ms-powerpoint','application/pdf','application/vnd.openxmlformats-officedocument.presentationml.presentation','application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']; if (!in_array($mime_type, $allowed_file_types)) { $failed.=$_FILES['fileval']["name"][$i].','; } } if(!empty($failed)){ echo '您上傳的檔案'.$failed.'不符合上傳規定'; exit; } 只要不是在上傳白名單中的檔案都會終止程式,也可以做導向返回首頁,讓檔案
最近的文章

寫了一個文字框textarea內容輸出樣板的function解決(保留原格式/字元轉編碼/URL自動加上連結)等問題-教學撰寫:徐嘉裕Neil hsu

在開發模組時並不是所有的文字框都要使用CK編輯器,CK編輯器使用JS生成消耗前端資源,用越多網站開啟越慢,一些純文字的內容用原生的textarea即可,但需要做一些處理,不然內容輸出樣板會有以下問題 1、若未設置nl2br函數保留原格式,所有的段行內容都會黏再一起。 2、若未做字元轉編碼htmlentities,則一些特殊字元無法正常顯示: 例如&會變成¢ 。 3、內容中如有URL無法自動產生連結。 會像下圖這樣 為了解決這問題,寫了一個function包含了(保留原格式/字元轉編碼/URL自動加上連結)等函數,code如下: function textprocessing($val=""){ //字元轉編碼 $val=htmlentities($val,ENT_QUOTES,"UTF-8"); //URL自動加上連結 $val = preg_replace('#(http|https|ftp|telnet)://([0-9a-z\.\-]+)(:?[0-9]*)([0-9a-z\_\/\?\&\=\%\.\;\#\-\~\+]*)#i','<a target="_blank" href="\1://\2\3\4" rel="nofollow">\1://\2\3\4</a>', $val); //保留原格式 return nl2br($val); } 在php上輸出內容變數加上textprocessing()函數 ECHO $message=textprocessing($val=$message); 或是在smarty樣板上直接引用函數也可以(php端就不需處理) <{$message|textprocessing}>  最後輸出結果如下圖 可以看到原格式斷行/特殊字元/URL加上連結都有處理了,這樣用一個function就能解決三個問題,有需要的朋友參考看看! 工作心得撰寫: 徐嘉裕 Neil hsu

分享一個PHP使用curl函數下載遠端檔案回本地端伺服器的function-教學撰寫:徐嘉裕Neil hsu

要下載遠端檔案回自己伺服器存放,方法很多,用fopen也行,但這裡不推薦,因為大部分虛擬主機的php.ini中allow_url_fopen都會設為Off,導致fopen函數擷取遠端檔案失敗,無法下載,解決方法就是使用安全性較高且為PHP預設套件curl函數來擷取遠端檔案,方法如下 假設我們要下載遠端的 https://img.youtube.com/vi/sDhU6nWWja8/maxresdefault.jpg 存放到伺服器端 /opt/lampp/htdocs/uploads/images/maxresdefault.jpg //function code //下載遠端檔案回本地端 function curlsave_file($inPath,$outPath){  //$inPath 遠端路徑 //$outPath 儲存本地端路徑 set_time_limit(0); //如果文件很大,請設置超時。 //文件處理 $new_file = fopen($outPath, "w") or die("cannot open" . $outPath); //curl操作 $cd = curl_init(); curl_setopt($cd, CURLOPT_URL, $inPath); curl_setopt($cd, CURLOPT_FILE, $new_file); // 超時為 30 秒,要下載大文件,您可能需要增加超時限制。 curl_setopt($cd, CURLOPT_TIMEOUT, 30);  //運行 curl 下載文件 curl_exec($cd); if (curl_errno($cd)) {   echo "the cURL error is : " . curl_error($cd); } else {   $status = curl_getinfo($cd);   echo $status["http_code"] == 200 ? "The File is Downloaded" : "The error code is : " . $status["http_code"] ;   // the

PHP->分享一個好用的jpge轉png的function-教學撰寫:徐嘉裕Neil hsu

最近升級Xoops布景架構,吧js播放器圖片由本的jpg轉為png,除了在創建圖檔及讀出圖檔的地方需要更改,也需要吧原本已經建立的jpg檔全部批次改為png,這樣user更新完布景才不會播放器圖片都顯示X,關於jpge轉png的方法上網G狗了一下,找到一個不錯且好用的function分享給大家 jpge轉png的function code //jpge轉png function function jpgtopngfunction($input_file="",$output_file=""){ //$input_file; 原始JPG檔路徑+檔名 //$output_file; 轉成PNG檔路徑+檔名 //檔案存在才執行 if(file_exists($input_file)) { $input = imagecreatefromjpeg($input_file); $width = imagesx($input); $height = imagesy($input); $output = imagecreatetruecolor($width, $height); $white = imagecolorallocate($output, 255, 255, 255); imagefilledrectangle($output, 0, 0, $width, $height, $white); imagecopy($output, $input, 0, 0, 0, 0, $width, $height); imagepng($output, $output_file); //刪除原始jpg檔 unlink($input_file); } } 在需要轉換的地方引用jpgtopngfunction()函數 例 jpgtopngfunction($input_file=" img.jpg ",$output_file=" img.png "); 這樣就會吧 img.jpg 複製一份為 img.png 後,再刪除原始的 img.jpg ,可以搭配foreach迴圈使用做批次修改,有需要的朋友參考看看 參考資料來源: https://itecnote.com/tecnote/php-gd-con

jQuery datepicker月曆去除時分秒選單功能-教學撰寫:徐嘉裕Neil hsu

 jQuery datepicker月曆是非常好用的時間選擇套件,可以選擇年/月/日/時/分/秒,不過最近剛好需要用到的時間格式為date,不需要時分秒,雖然官網有datepicker選單的設定方法,但我還是覺的自己寫一個js hack來處理比較快,以下為程式說明 原生的datepicker月曆套件因該是如下圖這樣,有完整的時間選項 只需要加上以下code,就能去除時分秒按鈕及文字框中的00:00:00 <script> $(document).ready(function() { $('body').on('change', ' #mydate1 ', function() {  //紅字為月曆input的id var date = $(this).val(); var newDate=/\d{4}-\d{1,2}-\d{1,2}/g.exec(date); $(this).val(newDate); $('.ui-timepicker-div').remove(); }) }); </script> 這樣就可以了,實際測試看看 時分秒套件已經被移除,文字框也不會再顯示00:00:00,這樣存進資料表date欄位就不會出錯,有需要的朋友參考看看! 工作心得撰寫: 徐嘉裕 Neil hsu

JS解決使用sortable()函數拖曳導致CK編輯器textarea被鎖定無法編輯的問題-教學撰寫:徐嘉裕Neil hsu

使用JS函數sortable()對CK編輯器進行拖曳時,會導致textarea被鎖定無法編輯,這是一個很頭痛的問題,還好在ckeditor官網找到解決方案,就是當拖曳觸發時(start)先銷毀CKEDITOR,拖曳結束(stop)在重建CKEDITOR,解決方法如下: function dragmenufunction() { $(".sortable").sortable({ items: ".sortablebox", //指定拖曳元件或ID及CLASS //拖曳開始 start: function(event, ui){ var textareaId = ui.item.find(' .editor ').attr('id' );  //紅字的.editor為textarea->class if (typeof textareaId != 'undefined') { var editorInstance = CKEDITOR.instances[textareaId]; editorInstance.destroy(); CKEDITOR.remove( textareaId ); } }, //拖曳結束 stop: function(event, ui){ var textareaId = ui.item.find(' .editor ').attr('id');   //紅字的.editor為textarea->class if (typeof textareaId != 'undefined') { CKEDITOR.replace( textareaId ); } } }); } 實際測試看看,當拖曳時ck編輯器會被銷毀呈現原生textar

JS遍歷select多選項目以陣列比對符合值-教學撰寫:徐嘉裕Neil hsu

要取得select多選項目(multiple)值必須使用each遍歷全部的select選單後取得selected狀態val,存成陣列再用$.inArray()比對陣列中是否有符合條件,以下為應用範例說明 例如有一個群組選單,我們要判斷【訪客】群組是否有被選取(val=3),如果有被選取則顯示->訪客報名啟用註冊功能欄位 如果沒有被選取則隱藏->訪客報名啟用註冊功能欄位 code如下說明 //html結構 <span id='helpBlock' class='help-block'>選擇可報名群組</span> <select class='form-control' id='browsegroup' name='browsegroup[]' multiple > <option value=1 data-id=1 >管理員</option> <option selected='selected' value=2 data-id=2 >註冊會員</option> <option selected='selected' value=3 data-id=3 >訪客</option> </select> <div class='col-sm-12' id='registerbox'> <label class='col-sm-6'><span id='helpBlock' class='help-block'>訪客報名啟用註冊功能</span> </label> <div class='col-sm-6'><label class='radio-inline'> <input class='' type='radio' id='' name