WordPress 檔案上傳時遇到「HTTP 錯誤」的可能原因與解法

使用 WordPress 的朋友在上傳圖片時,偶爾會遇到「HTTP 錯誤」的問題,上網搜尋會看到許多說法,有的說是檔案權限問題,有的則是說要加上一段程式碼到佈景內,其實這些說法都「有可能」,最正確的作法是去檢視伺服器的 Error Log 來判斷究竟錯誤原因為何,剛好今天我也遇到了這問題,就來整理一下我的解決方式以及可能的其他原因!

網路上的解法已經很多,這邊不贅述在操作的部分,針對背後的原因稍作說明,讓大家試著去判斷「發生了什麼事」,而非看到解法就嘗試看看,卻不知道發生了什麼事情,最後反而導致更多問題,其實這也是新手常遇到的狀況,遇到問題就 Google 答案照做,卻不知道背後究竟發生什麼事情,喪失了許多寶貴的學習機會。

會遇到這問題,最常見的可能性是 wp-content/uplaods 權限不足,導致 WordPress 無法幫你上傳檔案或建立資料夾,懶人解法是設為 777 也就是任何人可讀可寫可執行,如果伺服器只有你一個人使用而且不太在意資安的話,這樣還算馬虎可以,但更好的做法是指定正確的檔案擁有者、群組,並設定正確的權限數字例如 775。

檔案過大的問題也可能導致無法上傳,雖然理論上遇到該問題應該會有專門的錯誤訊息而非「HTTP 錯誤」,不過看到蠻多人有提到這可能性,就先列入此篇文章;遇到這問題時不單是調整網頁伺服器的「檔案上傳限制」就可以解決,包含記憶體限制、POST Data Size 都可能有關聯,因為 WordPress 檔案上傳是以 HTTP POST 來處理,如果你設定 POST 只能乘載 10MB 的資料,那即使你設定檔案上傳可以到 50MB 也沒用,記憶體限制也是同理。

也有可能,因為 PHP 在上傳檔案時會先暫存在 /tmp 目錄,如果該目錄不存在,或 PHP 沒有足夠的權限去寫入它,也可能導致上傳錯誤的問題發生。

有些未經證實的可能性猜測,例如檔案名稱還有特殊字元、伺服器記憶體不足、WordPress Bug 等等,可以透過許多方式交互判斷問題是什麼,例如把檔案名稱設定的很單純如 001.jpg ,試著上傳看能否成功,或是用 Google 搜尋最近一週有沒有人抱怨上傳錯誤來猜測有沒有可能是最新版 WordPress Bug 等等。

而這次我遇到的情況很有趣,前天寫文章時還可以正常上傳圖片,這幾天我沒有做任何操作,沒理由不能上傳,況且現在是 1 月,前幾天也是 1 月,上傳圖片使用的是同一個資料夾,所以也沒有建立資料夾的權限問題,經過檢查也確定跟權限問題無關,更討厭的是檢視 Apache Error Log 半句話也沒有… 後來才想到,這幾天唯一的變化是 WordPress 有自動升級,此外看到不少文章都提到「HTTP 錯誤」可能肇因於 PHP Image Library 不支援等等,因為 WordPress 預設使用 ImageMagick 來處理縮圖,如果你的伺服器未安裝 ImageMagick 或版本過舊就會上傳圖片失敗,果然,把 ImageMagick 升級之後就可以順利上傳了,我猜測是因為上個版本的 WordPress 有安全性方面的更新,導致 ImageMagick 如果過舊會無法使用等等。

在網路上看到要求修改 functions.php 並增加程式碼的做法,通常都是因為上面提到的 ImageMagick 問題,例如下面的程式碼,就是將 WordPress 預設的圖形處理模組改用 GD 而非 ImageMagick,但個人認為這是治標不治本的做法,更好的解法應該是在伺服器安裝 ImageMagick 阿!(或更新) 除非你使用的是虛擬主機,無法自己決定要安裝什麼,否則建議應該是安裝 ImageMagick 而非把預設的換成 GD。

add_filter( 'wp_image_editors', 'change_graphic_lib' );
function change_graphic_lib($array) {
  return array( 'WP_Image_Editor_GD', 'WP_Image_Editor_Imagick' );
}

在〈WordPress 檔案上傳時遇到「HTTP 錯誤」的可能原因與解法〉中有 2 則留言

  1. 有時候還會遇到缺少tmp 這目錄
    檔案上傳會先丟到這才copy到另一個目錄
    要自己建立才行 cc

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料