跳到主要內容

CentOS 7 + PHP 7 無法上傳檔案

下以動作請使用root權限控制,確保指令可以正確運作。

查看 vi /etc/php.ini

;;;;;;;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
; upload_tmp_dir =

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M

此設定說明,上傳檔案時,會先將檔案存放在預設/tmp 資料夾。
查看 /tmp 的權限應該為
drwxrwxrwt. 10 root root tmp
再往下檢查 /tmp下的檔案權限
ls /tmp -all
drwx------. 3 root root systemd-private-xxxxx-httpd.service-xxxxxx
將其擁有者修改為apache
chown -R apache /tmp/systemd-private-xxxxx-httpd.service-xxxxxx
再將其權限設定為755
chmod -R 755 /tmp/systemd-private-xxxxx-httpd.service-xxxxxx

--------------------------------------------------------------------------------
再來我們也需檢查PHP程式指定上傳的路徑
假設上傳路徑為 /var/www/html/upload
ls /var/www/html/upload
drwxr-xr-x. 2 myname web upload
將其擁有者修改為 apache
chown -R apache /var/www/html/upload
再將其權限設定為755
chmod -R 755 /var/www/html/upload

基本上這樣就可以讓上傳程式正常運作了。
如果,還是無法上傳檔案,那就是SELinux的限制了。
我們可以選擇關閉SELinux(以後不會遇到奇怪的問題,但安全性低)或是開放httpd上傳檔案設定。(安全性高)

關閉SELinux 

開啟檔案 vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#         enforcing - SELinux security policy is enforced.
#         permissive - SELinux prints warnings instead of enforcing.
#         disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#         targeted - Targeted processes are protected,
#         minimum - Modification of targeted policy. Only selected processes are protected.
#         mls - Multi Level Security protwction.
SELINUXTYPE=targeted

將SELINUX=enforcing 改為SELINUX=disabled
儲存後重新開機。

開放httpd上傳檔案設定

chcon -t httpd_sys_rw_content_t /var/www/mysite1/upload -R
因為預設的 webservice 能擁有的權限角色為 httpd_sys_content_t , 沒有寫入檔案的權限。

留言

這個網誌中的熱門文章

動態變更事件函數

因為供應型態的變更,會影響查詢選單的內容。為使用者方便,我們會使用到動態變更的方法來達成。 HTML 採購(INPUT TYPE='radio' id='purchase' name='purchase' value='0' onclick='change_menu(this)' checked) 製程(INPUT TYPE='radio' id='workcenter' name='purchase' onclick='change_menu(this)' value='1') 提供單位:(INPUT TYPE='text' id='supply_id' style='width:90px' ondblclick='search_supply(this)') Javascript function change_menu(topost) {   if (topost.id == 'purchase') {     node('supply_id').ondblclick = new Function("search_supply(this)");   } else {     node('supply_id').ondblclick = new Function("menu_terms(this, '1')");   } } 如果變更的Function 不需要參數,則直接填入Function 名稱即可。如: function change_menu(topost) {   if (topost.id == 'purchase') {     node('supply_id').ondblclick = search_supply;   } else {     node('supply_id').ondblclic...

讀取陣列

循環讀取陣列的指令 foreach ($array as $value) { echo $value; } //----------------------------- foreach ($array as $key => $value) { echo $array[$key] = $value . '...'; } ※參考文獻- http://dettori.pixnet.net/blog/post/5256403

Colorbox 使用筆記

Colorbox 詳細使用說明請參考 a jQuery lightbox 情境一: 當開發RWD網頁時,我想將 lightbox 的寬度依顯示螢幕的寬度來決定。 想讓 lightbox 的內容不會太擁擠或太空洞。 <script> var deviceWidth = 0; $(function() { deviceWidth = $(window).width(); $(window).resize(function(){ deviceWidth = $(window).width(); }); }); function showMessage() { var colorboxWidth = "100%"; if (deviceWidth > 767) { colorboxWidth = "70%"; } $.colorbox({innerWidth: colorbox}); } </script> 情境二: 為了讓使用者確實閱讀完 lightbox 內的訊息,想將關閉 lightbox 的熱鍵移除。 <script> function showMessage() { $.colorbox({ escKey: false,  // 按下esc鍵關閉 Colorbox 視窗 arrowKey: false,  // 按下方向鍵關閉 Colorbox 視窗 overlayClose: false  // 在背景遮罩點一下滑鼠左鍵,關閉 Colorbox 視窗 }); } </script> 情境三: 當 Lightbox 內的訊息太長,或需要互動性質的內容,開啓 iframe 功能,互動換頁才不會讓整個網頁換掉。 <script> function showMessage() { $.colorbox({ escKey: false, arrowKey: false, o...