2013-03-05 58 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"])