Javascript 为什么$\u文件[]总是空的? 问题
我正在尝试用Php和Javascript制作一个AJAX文件上传程序。我遇到的问题是,在我试图使用Javascript 为什么$\u文件[]总是空的? 问题,javascript,php,ajax,Javascript,Php,Ajax,我正在尝试用Php和Javascript制作一个AJAX文件上传程序。我遇到的问题是,在我试图使用move\u upload\u file函数的upload.php脚本中,$\u FILES数组总是空的 这是我到目前为止试过的 选中/etc/php/7.2/apache2/php.ini中的file\u uploads=On 检查了uploader.php和upload.php 已检查上载的文件权限 在/etc/php/7.2/apache2/php.ini MWE uploader.php
move\u upload\u file
函数的upload.php脚本中,$\u FILES
数组总是空的
这是我到目前为止试过的
- 选中
/etc/php/7.2/apache2/php.ini中的
file\u uploads=On
- 检查了
和uploader.php
upload.php
- 已检查
上载的文件权限
- 在
/etc/php/7.2/apache2/php.ini
uploader.php中的Javascript:
var upload_form=document.getElementById('upload_form');
var file_to_upload=document.getElementById('file_to_upload');
上传表单。添加文件列表(“提交”,上传文件);
函数上传文件(e){
e、 预防默认值();
var xhr=newXMLHttpRequest()
open(“POST”、“upload.php”);
setRequestHeader(“内容类型”、“多部分/表单数据”);
发送(新表单数据(上传表单));
}
upload.php:
根据,必须指定enctype=“多部分/表单数据”
。您还必须指定method=“post”
--
因此,您的
应该是:
<form class="form" id="upload_form" enctype="multipart/form-data" method="post">
在我的一个使用Framework-7的项目中。我也在使用ajax进行文件上传表单提交 按照@kmoser在回答中的建议去做,但也要按照以下要求去做: 最后在upload.php文件上编写以下代码:
if(isset($_FILES['myfile'])) {
//echo "uploaded something";
if($_FILES['myfile']['tmp_name'] != '') {
$tmp_filenm = $_FILES['myfile']['tmp_name'];
$file_name = time()."_".$_FILES['myfile']['name'];
$file_fullpath = $today_dir."/".$file_name;
//echo $file_fullpath;
move_uploaded_file("".$tmp_filenm,"$file_fullpath");
}
}
只需使用
enctype
属性作为以下
谢谢,@unclexo!你应该把这个作为答案,这样我就可以接受了。我在我的表单标签中添加了enctype=“multipart/form data”和method=“POST”
,并删除了xhr.setRequestHeader(“内容类型”,“multipart/form data”)行。另外,我在upload.php中有一个输入错误(或者更确切地说,在camel-case/snake-case中有一个不确定/不一致),在我的if(file_-exists())
检查中,我使用了$uploadedFile
而不是$uploaded_-file
。没关系!不客气!如果未使用AJAX提交表单,则必须使用方法类型post
提供编码类型multipart/formdata
。但是,如果使用ajax提交包含文件的表单,则不需要提供它们,因为现代浏览器会在引擎盖下添加编码类型(并且,您可以在ajax请求中告知方法类型)。但是作为一个好的实践,你应该提供它们。@unclexo现在我很困惑。。。我想在我的示例中,我是用AJAX提交表单的?这不是e.preventDefault()
和XMLHttpRequest
对象正在做的事情吗?请不要混淆。试试各种方法。我的意思是尝试将enctype
和method
属性签出(仅用于实验目的)。它也起作用。顺便说一下,请参考您可以学习如何正确上传php文件的地方。谢谢,@kmoser。注意,我还必须删除xhr.setRequestHeader(“内容类型”、“多部分/表单数据”)代码>来自javascript,我的代码中有一个输入错误(参见我对这个问题的评论)。
$$('#submission').on('click', function(){
//alert('here');
//var test = $('#upload_form').serializeArray();
var fileInputElement = document.getElementById('file_to_upload');
var formData = new FormData();
formData.append('myfile', fileInputElement.files[0]);
var request = new XMLHttpRequest();
request.open("POST", "https://yourwebsite/upload.php");
request.send(formData);
//console.log(request.response);
request.onreadystatechange = function() {//Call a function when the state changes.
if(request.readyState == 4 && request.status == 200) {
alert("File has been uploaded successfully!");
//console.log('here');
location.reload();
}
}
});
if(isset($_FILES['myfile'])) {
//echo "uploaded something";
if($_FILES['myfile']['tmp_name'] != '') {
$tmp_filenm = $_FILES['myfile']['tmp_name'];
$file_name = time()."_".$_FILES['myfile']['name'];
$file_fullpath = $today_dir."/".$file_name;
//echo $file_fullpath;
move_uploaded_file("".$tmp_filenm,"$file_fullpath");
}
}