Javascript 为什么$\u文件[]总是空的? 问题

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

我正在尝试用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中的Html:



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

    }
}