2013-03-05 54 views
6

我想弄清楚如何在同一個XMLHttpRequest內發送文件和參數。這可能嗎?XHR.send(file + params)?

顯然我可以做xhr.send(file + params)或者xhr。(file,params)。而且我不認爲我可以設置兩個不同的請求頭做到這一點...

xhr.setRequestHead('X_FILENAME', file.name) 
xhr.send(file); 
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xhr.send(params); 

是否有某種方式來發送PARAMS而不必使用GET或輔助XHR請求?

+2

你可能不得不使用FormData https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData – 2013-03-05 07:44:12

+0

也請參考http://stackoverflow.com/questions/5602021/submitting-a-html-form -with-ajax-that-includes-a-file-input和http://stackoverflow.com/questions/6974684/how-to-send-formdata-objects-with-ajax-requests-in-jquery – 2013-03-05 07:45:21

+0

@ Charles:你如何通過XHR發送文件?你是通過File API讀取它的客戶端,還是...? (這很重要,因爲如果你通過File API讀取它的客戶端,那麼它只是另一個參數......) – 2013-03-05 07:49:56

回答

6

有沒有辦法發送參數而不必使用GET或輔助xhr請求?

是的,你可以將它們編碼到URL中(就像GET),即使你正在做POST。例如:

xhr.open(yourUrl + "?foo=" + encodeURIComponent(foo) + "&bar=" + encodeURIComponent(bar)); 
// ... 
xhr.send(file); 

我在上面假設你必須知道通過XHR發送一個文件,但我不知道。 :-)


假設file是文件的實際內容,通過File API讀取,那麼是不是隻是一個參數?所以:

xhr.send(
    "filedata=" + encodeURIComponent(file) + 
    "&foo=" + encodeURIComponent(foo) + 
    "&bar=" + encodeURIComponent(bar) 
); 
+0

這就是我所說的使用GET的含義......我不想將它們追加到URL中。 – 2013-03-05 07:48:30

+0

@CharlesJohnThompsonIII:好吧,它不**使用'GET'。你仍然在使用'POST',你只是在兩個地方傳遞數據,這是非常正常的。如果你不想在URL中發送數據,那麼說,而不是你不想使用'GET'。這些是不同的陳述。 – 2013-03-05 07:49:06

+0

嗯...我仍然通過$ _POST服務器端訪問變量?如果是這種情況,那麼它可能是有效的。我試着避免$ _GET,因爲它更容易操縱信息。 – 2013-03-05 07:51:11

7

如果你依賴於支持FormData瀏覽器,你可以使用下面的代碼(JavaScript的):

var formData = new FormData(); 
formData.append('param1', 'myParam'); 
formData.append('param2', 12345); 
formData.append('uploadDir', 'public-data'); 
formData.append('myfile', file); 

xhr.send(formData); 

然後,在你的服務器端,您可以通過訪問您的變量這個代碼(PHP):

<? 
    $param1 = $_POST['param1']; //myParam 
    $param2 = $_POST['param2']; //12345 
    $uploaddir = $_POST['uploadDir']; //public-data 
    $fileName = $_FILES['myfile']['name']; 
    $fileZise = $_FILES['myfile']['size']; 
    $uploaddir = getcwd().DIRECTORY_SEPARATOR.$uploaddir.DIRECTORY_SEPARATOR; 
    $uploadfile = $uploaddir.basename($fileName);  
    move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile); 
    echo $fileName.' ['.$fileZise.'] was uploaded successfully!'; 
?> 

要獲得$_FILES['myfile']所有參數,使用var_dump($_FILES["myfile"])