首頁  >  文章  >  web前端  >  jQuery Ajax檔上傳(php)

jQuery Ajax檔上傳(php)

高洛峰
高洛峰原創
2017-01-06 14:41:031113瀏覽

如何實現jQuery的Ajax文件上傳,PHP如實文件上傳.
AJAX上傳文件,PHP上傳文件。

【PHP檔案上傳】

在開始之前,我覺得是有必要把通WEB上傳檔案的原理簡單說一下的。
實際上,這裡不管是PHP,JSP,還是ASP處理上傳的文件,其實都是WEB早已把文件上傳到伺服器了,我們只是運用上傳處理函數來處理上傳的文件。
而處理函數一般都是用PHP,JSP,ASP等服務端語言來實現的。那麼如何透過WEB(HTTP協定來上傳檔案呢?)你需要類似以下的HTML程式碼:
test.html

<form action="do_file_upload.php" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="picture" />
<input type="submit" value="Send" />
</p>
</form>

注意:enctype="multipart/form-data",是必要的,它告訴FORM表這個是一文件上傳類型,一旦這次請求成功後,文件就被上傳到了伺服器的臨時資料夾中,
至於到達目的地後,文件將會被怎麼樣處理那就是PHP,JSP,ASP的事了。
(不過,你不要高興的太早,如果該文件沒有被移動到其它地方也沒有被改名,則該文件將在表單請求結束時被刪除。所以我們要寫一個處理上傳文件的腳本)
這裡我們用PHP來處理
do_file_upload.php

<?php
$error = ""; //上传文件出错信息
$msg = "";
$fileElementName = &#39;picture&#39;;
    $allowType = array(".jpg",".gif",".png"); //允许上传的文件类型
    $num      = strrpos($_FILES[&#39;picture&#39;][&#39;name&#39;] ,&#39;.&#39;);  
$fileSuffixName    = substr($_FILES[&#39;picture&#39;][&#39;name&#39;],$num,8);//此数可变  
$fileSuffixName    = strtolower($fileSuffixName); //确定上传文件的类型

$upFilePath             = &#39;d:/&#39;; //最终存放路径
if(!empty($_FILES[$fileElementName][&#39;error&#39;]))
{
   switch($_FILES[$fileElementName][&#39;error&#39;])
   {
    case &#39;1&#39;:
     $error = &#39;传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值&#39;;
     break;
    case &#39;2&#39;:
     $error = &#39;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值&#39;;
     break;
    case &#39;3&#39;:
     $error = &#39;文件只有部分被上传&#39;;
     break;
    case &#39;4&#39;:
     $error = &#39;没有文件被上传&#39;;
     break;
    case &#39;6&#39;:
     $error = &#39;找不到临时文件夹&#39;;
     break;
    case &#39;7&#39;:
     $error = &#39;文件写入失败&#39;;
     break;
    default:
     $error = &#39;未知错误&#39;;
   }
}elseif(empty($_FILES[&#39;fileToUpload&#39;][&#39;tmp_name&#39;]) || $_FILES[&#39;fileToUpload&#39;][&#39;tmp_name&#39;] == &#39;none&#39;)
{
   $error = &#39;没有上传文件.&#39;;
}else if(!in_array($fileSuffixName,$allowType))
{
   $error = &#39;不允许上传的文件类型&#39;; 
}else{
  );
   if($ok === FALSE){
    $error = &#39;上传失败&#39;;
   }
}
?>

另註:關於$_FILES數組

此數組包含有所有上傳的文件資訊,即記錄下了上傳文件時的相關資訊。 
以上範例中 $_FILES 陣列的內容如下所示。我們假設檔案上傳欄位的名稱如上例所示,為 userfile。名稱可隨意命名。

$_FILES['userfile']['name'] 
客戶端機器檔案的原名稱。

$_FILES['userfile']['type'] 
檔案的 MIME 類型,如果瀏覽器提供此資訊的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端並不檢查,因此不要想當然認為有這個值。

$_FILES['userfile']['size'] 
已上傳檔案的大小,單位為位元組。

$_FILES['userfile']['tmp_name'] 
檔案上傳後在服務端儲存的暫存檔案名稱。

$_FILES['userfile']['error'] 
和該檔案上傳相關的錯誤代碼。此項目是在 PHP 4.2.0 版本中增加的。

【AJAX檔案上傳】

其實就是實作無刷新式的檔案上傳。可採用IFRAME文件上傳原理。
實際上在用PHP上傳檔案時。 。 。只能用$_FILES形式,但是若我們只是單一的用JS方式取其ID,如..document.getElementById('img').value或者jquery形式的$("#img")都是不能正真實際上傳的(但還是有很多人這樣做,剛開始時我也是)。
可是功能上又要要求實現所謂的“非同步上傳”,怎麼辦呢? ?只能藉助第三方的元件,或自己寫一個(在網頁裡嵌入一個IFRAME)。但如果是考慮開發時間,那以用第三方的,這裡有一個不錯的jQuery的Ajax檔案上傳的元件,是「ajaxfileupload.js",其元件下載地址為:http://www.phpletter.com/ ,下載完畢裡面有一個php的應用程式demo,很容易看懂的。
流程:
(1 )前端上檔案的程式碼: test.php       

    <script type="text/javascript" src="jquery.js"></script> 
    <script type="text/javascript" src="ajaxfileupload.js"></script>
    <script type="text/javascript">
       function ajaxFileUpload()
               {
                  $.ajaxFileUpload
                     (
                       {
                            url:&#39;doajaxfileupload.php&#39;, //你处理上传文件的服务端
                            secureuri:false,
                            fileElementId:&#39;img&#39;,
                            dataType: &#39;json&#39;,
                            success: function (data)
                                  {
                                    alert(data.file_infor);
                                  }
                               }
                         )
                       return false;
                 } 
     </script>

對應的HTML為:

        <input id="img" type="file" size="45" name="img" class="input">
        <button class="button" id="buttonUpload" onclick="return ajaxFileUpload();">Upload</button>

這樣客戶端就完成了。

(2) 再伺服器端時   doajaxfileupload.php

   此處為了簡單的偵測是否真正的傳值過來了,你可以將它存起來了。
             $file_infor = var_export($_FILES,true);
           php檔案時,你又看到了熟悉的資訊了:

     array(
             &#39;name&#39;=>&#39;lamp.jpg&#39;,
             &#39;type&#39;=>&#39;image/pjpeg&#39;,
             &#39;tmp_name&#39;=>&#39;c:\windows\temp\phpFA.tmp&#39;,
             &#39;error&#39;=>0,
             &#39;size&#39;=>3127
         )

當然,真正的處理類於這樣的:

   <?php
     $upFilePath = "d:/";
     );
   if($ok === FALSE){
    echo json_encode(&#39;file_infor&#39;=>&#39;上传失败&#39;);
   }else{
    echo json_encode(&#39;file_infor&#39;=>&#39;上传成功&#39;);
   }
   ?>

另註:實際上,你可以在一個頁面裡嵌入一個IFRAME,然後在IFRAME使用原生的POST表單提交.JQUERY的這個插件也是採用了這種方式。只不過它是動態產生的IFRAME 與表單

更多jQuery Ajax檔案上傳(php)相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn