2015-09-22 55 views
-1

我想要做的是抓住一個上傳的圖像文件,並打印出$ _FILES數組來顯示圖像的不同屬性。我嘗試使用ajax,以便在提交表單時不需要重新刷新頁面。首先我用這行代碼在我的Ajax調用何時使用XMLHttpRequest的sentRequestHeader方法?

xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

但我響應call.Then我註釋掉的代碼這一行收到一個空數組,我得到充滿了所有必要的信息數組關於上傳的圖像。

陣列(1){[ 「圖像」] =>陣列(5){[ 「名稱」] =>串(9) 「Koala.jpg」 [ 「型」] =>串(10 )「image/jpeg」[「tmp_name」] => string(24) 「C:\ xampp \ tmp \ php8E8B.tmp」[「error」] => int(0)[「size」] => int 780831)}}

所以我的問題時使用setRequestHeader()mehtod.When它必須在那裏,當它不能?謝謝!

<html> 

<body> 
<form id='form'> 

    <input type='button' value='submit' name='submit' id='btn'> 
    <input type='file' name='image' id='image'> 
</form> 
<span id='output'></span> 
<script> 

    function callajax(e){ 
     var form=document.getElementById('form'); 

     var xhr=new XMLHttpRequest(); 

     xhr.onreadystatechange=function(){ 
      if(xhr.readyState==4 && xhr.status==200){ 
       document.getElementById('output').innerHTML=xhr.responseText; 
      } 
     } 
     var data=new FormData(form); 
     xhr.open("POST", "call.php", true) 
    // xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     xhr.send(data); 
    } 

    document.getElementById('btn').addEventListener('click',callajax,false); 
</script> 
</body> 

</html> 

PHP ::

var_dump($_FILES); 

回答

2

您使用setRequestHeader當你需要設置一個請求頭。

該瀏覽器將根據在the send method在spec中描述的算法自動地設定Content-Type請求頭。

如果設置Content-Type頭,然後三件事情之一會發生:

  • 您將複製自動檢測
  • 你會糾正不正確的MIME類型
  • 您將設置不正確的MIME類型

當您將FormData對象傳遞到send()時,它將使用multipart/form-data對其進行編碼。

將其明確設置爲application/x-www-form-urlencoded將設置不正確的MIME類型。 PHP將嘗試使用application/x-www-form-urlencoded的算法解碼數據並失敗。然後它將不會填充$_POST$_FILES

如果它設置不正確的MIME類型,那麼我們爲什麼需要它..

目前尚不清楚你所說的「它」在這裏的意思。

如果您通過FormData對象並且不要覆蓋Content-Type標頭,那麼XmlHttpRequest算法將設置正確的Content-Type標頭。

,什麼是所有關於發送頭

。它有許多含義很多頭。Content-Type標題告訴服務器請求正文中的數據類型。

+0

謝謝!如果它設置了不正確的MIME類型,那麼爲什麼我們需要它......以及發送標題的全部內容 –