2011-09-29 72 views
5

一個全日制的學習後& &努力,我終於通過純AJAX放棄上傳文件(PS:這篇文章How can I upload files asynchronously with JQuery?埋葬了我最後的希望)爲什麼我不能異步上傳文件?

我的問題可能有點意義,但我還是想知道爲什麼ajax(或XMLHttpRequest)不能處理這個問題?爲什麼不能像真正的httprequest那樣傳輸文件?

+2

因爲JavaScript不能讀取本地文件 - 至少不是沒有一些HTML 5 API魔法的幫助。 –

+0

@PeKKa這意味着AJAX請求(與JS)和表單請求(與HTML)是完全不同的東西?即使對瀏覽器? – rhapsodyn

+2

不是真的 - 您可以使用Ajax構建任何類型的請求。它僅僅是出於安全原因訪問JavaScript中不可能的本地文件。 –

回答

6

由於安全原因,Javascript無法讀取本地文件,所以我們無法使用AJAX發送數據。

但是,您可以發佈標準HTML表單,並將表單目標設置爲頁面上的不可見iframe。這個iframe可以使用服務器端代碼來處理上傳。

如果您使用AJAX的原因是因爲您希望在文件上傳過程中使用進度條,請使用此方法使用服務器端靜態變量來存儲文件上傳的進度,然後使用AJAX向另一個HTTP頁面發送一個簡單的定時請求,該頁面只返回上傳進度。

2

正如更新的答案,以防有人使用Google,XMLHttpRequest 2級確實支持AJAX提交文件輸入。

瀏覽器支持:

http://caniuse.com/xhr2

它使用FORMDATA Javascript對象。

How to send FormData objects with Ajax-requests in jQuery?

不要忘記關閉過程數據和contentType中,如果你這樣做。

var fd = new FormData();  
fd.append('file', input.files[0]); 

$.ajax({ 
    url: 'http://example.com/script.php', 
    data: fd, 
    processData: false, 
    contentType: false, 
    type: 'POST', 
    success: function(data){ 
    alert(data); 
    } 
});