我试图找出如何在同一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请求的情况下发送参数?
答案 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)
);