php上傳文件失敗,php上傳文件失敗原因

本文目錄一覽:

PHP上傳文件失敗

提示顯示的很清楚的。文件已經上傳了,但是在把文件從臨時文件夾移出來出錯了。注意新地址是否正確

可以使用絕對路徑或者相對路徑,看個人

php無法上傳文件該怎麼辦?

先試下這段代碼,是最標準的demo

?php

if ((($_FILES[“file”][“type”] == “image/gif”)

|| ($_FILES[“file”][“type”] == “image/jpeg”)

|| ($_FILES[“file”][“type”] == “image/pjpeg”))

 ($_FILES[“file”][“size”]  20000))

  {

  if ($_FILES[“file”][“error”]  0)

    {

    echo “Return Code: ” . $_FILES[“file”][“error”] . “br /”;

    }

  else

    {

    echo “Upload: ” . $_FILES[“file”][“name”] . “br /”;

    echo “Type: ” . $_FILES[“file”][“type”] . “br /”;

    echo “Size: ” . ($_FILES[“file”][“size”] / 1024) . ” Kbbr /”;

    echo “Temp file: ” . $_FILES[“file”][“tmp_name”] . “br /”;

    if (file_exists(“upload/” . $_FILES[“file”][“name”]))

      {

      echo $_FILES[“file”][“name”] . ” already exists. “;

      }

    else

      {

      move_uploaded_file($_FILES[“file”][“tmp_name”],

      “upload/” . $_FILES[“file”][“name”]);

      echo “Stored in: ” . “upload/” . $_FILES[“file”][“name”];

      }

    }

  }

else

  {

  echo “Invalid file”;

  }

?

上面的腳本檢測了是否已存在此文件,如果不存在,則把文件拷貝到指定的文件夾。

注釋:這個例子把文件保存到了名為 “upload” 的新文件夾。

php中文件上傳失敗

上傳成功了,只是上傳到臨時目錄了,然後移到指定目錄失敗了,你好好看看move_uploaded_file函數的參數是不是有問題。

php無法上傳文件

我也遇到過,我是APACHE+PHP的環境。

造成這個情況的原因可能比較多,我也只說的出來幾個,你試一下

1.PHP程序的問題,如果可能的話,看一下源代碼的上傳模塊。

2.上傳文件的文件名必須是中文,或者必須是英文or數字.

3.如果有後台的話,則有可能是後台的功能配置,特別注意一下上傳文件的大小與格式。

如果還是不能上傳,我就懷疑是上傳模塊的問題了,你可以給你的Php站加一個上傳模塊,或者從後台上傳。 而且有的模塊是只能從後台上傳,也就是只有管理員可以上傳。

php文件上傳失敗的問題

在用PHP進行文件上傳的操作中,需要知道怎麼控制上傳文件大小的設置,而文件可傳大小是受到多種因素制約的,現總結如下:

1、php.ini:upload_max_filesize 所上傳的文件的最大大小。默認值2M。

2、php.ini:memory_limit 本指令設定了一個腳本所能夠申請到的最大內存字節數,默認值8M。如果不需要任何內存上的限制,必須將其設為 -1。如果內存不夠,則可能出現錯誤:Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

3、php.ini:post_max_size 設定POST數據所允許的最大大小。此設定也影響到文件上傳。要上傳大文件,該值必須大於 upload_max_filesize。

4、php.ini:max_execution_time = 30 ; Maximum execution time of each script, in seconds

5、php.ini:max_input_time = 60 ; Maximum amount of time each script may spend parsing request data

6、如果用到mysql的BLOB進行二進制文件存儲,則需要設置my.ini:max_allowed_packet=xxM

7、httpd.conf

在 Apache 裡面有一個選項是 LimitRequestBody,這個選項可以限制用戶送出的 HTTP 請求內容。這個選項可以在 .htaccess 或 httpd.conf 里使用,而如果在 httpd.conf 內使用,分別可以用在 virtualhost 或目錄屬性設定。而 LimitRequestBody 的設定值是介乎 0 (無限制) 至 2147483647 (2GB)。

例如要在目錄 D:/AppServ/www 設定上傳限制為 100K,可以在 .htaccess 或 httpd.conf 加入以下語句:

LimitRequestBody 1024000000

Options Indexes FollowSymLinks MultiViews ExecCGI

AllowOverride All

Order allow,deny

Allow from all

LimitRequestBody 1024000000Options Indexes FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder allow,denyAllow from all

如果透過 .htaccess 設定,儲存檔案後會立即生效;如透過 httpd.conf 設定,須要重新啟動 Apache。

PHP關於文件上傳部分,特別提到表單隱藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文檔中給出的例子如下:

form enctype=”multipart/form-data” action=”_URL_” method=”POST”

input type=”hidden” name=”MAX_FILE_SIZE” value=”30000″

Send this file: input name=”userfile” type=”file”

input type=”submit” value=”Send File”

form

Send this file:

這裡設置MAX_FILE_SIZE = 30000,期待一種可能,使得瀏覽器在傳送文件之前能夠依此作出預先判斷,如果文件尺寸大於30000字節,則不執行實際的POST動作。也就是不往服務器發送文件內容,而是直接在客戶端提醒用戶“你試圖上傳的文件超過30000字節”。

這的確是一個非常棒的主張,但在現實中卻暫時無法實現。不是因為這個限制可以“被簡單地繞過”,而是IE和FireFox這兩個主流瀏覽器都不支持這個特性。PHP的這個建議尚未被採納。

MAX_FILE_SIZE還有一個用場:後台PHP會判斷接收到的文件大小是否大於這個值,如果超出,$_FILES[‘thisfile’][‘error’]會被設置為UPLOAD_ERR_FORM_SIZE(2),同時放棄保存臨時文件,將$_FILES[‘thisfile’][‘size’]置0。

這個例子,沒問題,表現正常,當我試圖上傳一個40多K的文件時,PHP程序報告“文件超過MAX_FILE_SIZE”。

但是,如果我們將表單中的MAX_FILE_SIZE從30000減少到1000,情形又如何呢?

上傳800字節的文件,正常;

上傳40K的文件,PHP報告文件過大,也正常;

上傳3000個字節的文件,PHP未報告錯誤,它成功保存了文件!出乎意料!

問題就出在main/rfc1867.c中判斷文件是否超長的這部分代碼上。php每次從buffer中讀取FILLUNIT字節長度的內容後,首先判斷“已經讀到的內容長度(total_bytes)”是否大於MAX_FILE_SIZE,然後再增加“已經讀到的內容長度(total_bytes)”。這樣一來,和預計的結果之間至多會有FILLUNIT字節的誤差,而FILLUNIT=1024*5=5K。(點擊bug了解詳細內容)

這就是說,當MAX_FILE_SIZE5K時,上傳一個大於MAX_FILE_SIZE,但是小於5K的文件是沒有問題的。

當然,因為這個設置很容易被繞過,所以服務器端編程不應當依賴於MAX_FILE_SIZE。而且,5K到底是個很小的數值,對大多數上傳文件的表單來說沒有影響。

PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的設置,和客戶端上傳給服務器端的流量大小無關。

Apache服務器從客戶端接收長度不超過LimitRequestBody字節數的請求,然後傳送給php模塊,php模塊再決定是否保存成臨時文件,設置$_FILES全局變量,移交給script進一步處理。

這個Apache的LimitRequestBody選項缺省值=0,允許Request body的最大字節數是2G(Linux + Apache)

最後還要注意的是:

html本身能夠post數據也是有限制的,不能超過2G。

FTP客戶端有文件偏移指針的2GB邊界限制,未使用特殊編譯flag編譯的ftp服務器端或者客戶端,無論在什麼FS中都不支持大於2GB的文件。不知道PHP會不會也有這種情況。

原創文章,作者:YZNP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/145688.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YZNP的頭像YZNP
上一篇 2024-10-27 23:52
下一篇 2024-10-27 23:52

相關推薦

  • 為什麼Python不能編譯?——從多個方面淺析原因和解決方法

    Python作為很多開發人員、數據科學家和計算機學習者的首選編程語言之一,受到了廣泛關注和應用。但與之伴隨的問題之一是Python不能編譯,這給基於編譯的開發和部署方式帶來不少麻煩…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Python運行不報錯又無任何結果輸出可能產生的原因以及解決方法

    在Python編程過程中,有時候會出現程序運行不報錯但卻沒有任何結果輸出的情況。本文將從多個方面解析這個問題,並提供相應的解決方法。 一、語法錯誤 語法錯誤是Python程序中最常…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • Python運行慢的原因

    Python語言一直被人們認為是一門易於學習和使用的語言,被廣泛應用於數據分析、機器學習和人工智能等領域。然而,與其他編程語言相比,Python的運行速度卻明顯較慢,這是因為以下幾…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • Python OOM異常的原因和解決方法

    Out of Memory(OOM)異常是 Python 程序在內存不足或不足以分配新的對象時,拋出的異常之一。Python 應用程序通常會因為內存瓶頸而崩潰或降低性能,但這並不是…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • Python無法運行的原因及解決方法

    Python是一種開源的高級編程語言,具有簡潔易讀、易於學習、跨平台等特點,深受開發者喜愛。但有時候我們會遇到Python無法正常運行的問題,這時候我們需要逐一排查,找出問題所在,…

    編程 2025-04-27

發表回復

登錄後才能評論