基於PHP的AJAX技術實現檔案非同步上傳

來源:互聯網
上載者:User

   非同步檔案上傳是在現代的AJAX實現的Web應用裡面經常要遇到,必須解決的問題。但是標準的AJAX類(XmlHttpRequest)無法實現傳輸檔案的功能。因此,這裡討論的內容就是如何在AJAX的技術的基礎之上構建非同步檔案上傳功能。在這個功能當中需要使用到內建的框及(IFRAME)來傳輸檔案。這個功能實現的效果是頁面在上傳檔案的時候,使用者還可以使用該頁面並且填寫檔案描述。

  這個例子是我們引用AJAX的經典案例進行分析的。

  系統內容

  · 較新版本的瀏覽器。例如Opera,Firefox或者 Internet Explorer。

  · PHP 4.3.0 或更高版本

  · PHP 5 版本

  · PHP 中的 'short_open_tag' 選項開啟(否則會發生解析錯誤)。

  功能分析

  通過內建的IFRAME(架構)進行檔案上傳。具備包括三個部分組成。

  · 在頁面中間有一個簡單的控制項。這個表單的目標連結就是一個隱藏得IFRAME(通過 CSS的風格" display: none;"實現)並且表單裡面唯一一個控制項的OnChange事件用來觸發JavaScript函數。這個函數的作用是檢查使用者提交的副檔名,然後提交表單。

  · 在伺服器端用PHP編寫了一個處理過程(用FILEFRAME坐注釋了)。這個處理過程用來把從用戶端上傳的檔案進行檢查後儲存在伺服器,並且通過Javascript代碼的形式返回給使用者。返回給使用者的Javascript指令碼通過"parent.window.document"更改了使用者現在正在查看的頁面,設定了檔案的名稱並啟用了讓使用者提交表單的按鈕。啟用按鈕的操作是通過getElementById函數實現的。

  · 在首頁面還有一個表單,它包含了使用者提交的描述和隱藏的檔案名稱。使用者可以在檔案上傳的同時填寫檔案的描述。當檔案上傳結束以後,使用者點擊按鈕,就可以看上傳以後返回給使用者的檔案資訊了。(通過返回來的檔案名稱和使用者輸入的描述構成檔案資訊)。

  可能你會說這麼操作不符合常理:檔案在使用者確認之前就已經被提交了。如果使用者沒有提交的話,情況會如何呢。你可以自己在擴充處理被使用者放棄的檔案。

  這個例子把檔案儲存體在一個檔案系統的目錄下。你需要在指令碼開始啟動並執行時候配置下這個目錄,具體的包含這個目錄資訊的變數是$upload_dir 和$web_upload_dir。這裡有一個對目錄是否可寫的許可權檢查。

  這裡我們用到了以下幾個PHP函數:

  · move_uploaded_file - 轉移一經上傳到伺服器的檔案

  · fopen - 開啟檔案

  · fwrite - 把內容寫入檔案

  · fclose - 關閉檔案

  · str_replace - 替換字串

  · filesize - 返迴文件大小

  · filemtime - 返回處理時間

  你可以通過手冊查到這些函數如果使用。請注意要把HTM(<, >, &)標記替換為(<, > 和 &).

  原始碼

  $upload_dir = "/var/www/anyexample/aeu"; // 檔案儲存體的路徑

  $web_upload_dir = "/aeu"; // 檔案在Web目錄下的路徑

  $tf = $upload_dir.'/'.md5(rand()).".test";

  $f = @fopen($tf, "w");

  if ($f == false)

  die("Fatal error! {$upload_dir} is not writable. Set 'chmod 777 {$upload_dir}'

  or something like this");

  fclose($f);

  unlink($tf);

  //處理上傳的檔案

  if (isset($_POST['fileframe']))

  {

  $result = 'ERROR';

  $result_msg = 'No FILE field found';

  if (isset($_FILES['file'])) // 從瀏覽器接受檔案

  {

  if ($_FILES['file']['error'] == UPLOAD_ERR_OK) // 沒有錯誤

  {

  $filename = $_FILES['file']['name']; // 檔案名稱

  move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir.'/'.$filename);

  // 處理的主過程-轉移檔案到 $upload_dir

  $result = 'OK';

  }

  elseif ($_FILES['file']['error'] == UPLOAD_ERR_INI_SIZE)

  $result_msg = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';

  else

  $result_msg = 'Unknown error';

  }

  echo '';

  echo '

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。