XHR.send(文件+参数)?

时间:2013-03-05 07:42:26

标签: javascript ajax html5 xmlhttprequest

我试图找出如何在同一XMLHttpRequest中发送文件和参数。这可能吗?

显然我可以做xhr.send(文件+参数)或xhr。(文件,参数)。而且我认为我不能设置两个不同的请求标头来执行此操作...

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

有没有办法在不使用GET或次要xhr请求的情况下发送参数?

2 个答案:

答案 0 :(得分:11)

如果您依赖支持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"])

答案 1 :(得分:6)

  

有没有办法在不使用GET或次要xhr请求的情况下发送参数?

是的,您可以将它们编码到网址中(就像GET),即使您正在执行POST。 E.g:

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)
);