我有以下代码:
<?php
if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_FILES ) ){
ob_clean();
/*
process the uploaded files
--------------------------
check if there were errors
check filesize
check filetype
check is_uploaded_file
check if already exists
etc
*/
$output=array();
$files=(object)$_FILES[ 'files' ];
foreach( $files->name as $i => $void ){
$name = $files->name[$i];
$size = $files->size[$i];
$type = $files->type[$i];
$tmp = $files->tmp_name[$i];
$error= $files->error[$i];
$output[]=array('name'=>$name,'size'=>$size,'type'=>$type);
}
exit( json_encode( $output ) );
}
?>
<!doctype html>
<html>
<head>
<meta charset='utf-8' />
<title>Browse multiple locations</title>
<script>
(function(){
function ajax(url,payload,callback){
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
if( this.readyState==4 && this.status==200 )callback.call( this, this.response );
};
xhr.open( 'POST', url, true );
xhr.send( payload );
}
document.addEventListener('DOMContentLoaded',function(){
let fd=new FormData();
const callback=function(r){
console.info( r )
let json=JSON.parse( r );
fd=new FormData();
document.getElementById('count').innerHTML=Object.keys( json ).length + ' files uploaded';
};
let oFile=document.querySelector('input[type="file"]');
let oBttn=document.querySelector('input[type="button"]');
oFile.addEventListener( 'change', function(e){
for( var i=0; i < this.files.length; i++ ) fd.append( 'files[]', this.files[ i ], this.files[ i ].name );
document.getElementById('count').innerHTML=fd.getAll('files[]').length+' files in array';
},false );
oBttn.addEventListener( 'click', function(e){
if( fd.getAll('files[]').length > 0 ) ajax.call( this, location.href, fd, callback );
},false );
}, false );
})();
</script>
</head>
<body>
<form>
<div id='count'></div>
<input type='file' name='files' multiple />
<input type='button' value='Upload Files' />
</form>
</body>
该代码的目的应该是允许一个网页上的多个上载,但可以来自不同的目录。即上传过程将会
浏览->选择文件-> 浏览->选择文件->上传。
我了解PHP和HTML代码,但承认我对javascript的工作不了解。我在Google上搜索了很多,并且有一个好主意,但这并不彻底。
当我使用wamp服务器测试代码时,会发生以下情况:
1)我在浏览过程中选择了$ n $个文件,文本显示为“ $ n $个文件已添加到数组中”,就像查看javascript一样。
2)我再次浏览并选择$ m $更多文件,文本将显示“ $ n + m $个文件已添加到阵列”。
3)我按了上载,它会显示“ $ n + m $个文件,根据观看javascript的需要,已上传”。此时,如果您在谷歌浏览器中打开了控制台,则会显示已上传的文件。
我的问题是,在开始时访问if语句似乎存在问题。我在内部添加了echo "hello"
作为测试,它没有回声。我什至在if语句之外尝试了var_dump(_FILES['files'])
(编辑:我的意思是var_dump($_FILES['files'])
),它没有全部上载(通常只有最后一个要上载或没有上载)。是什么使我无法处理上传的文件?上传的文件要去哪里?它们如何显示在控制台中?
我在这里很新,对编程还是很陌生。如果可以采取任何措施来改善帖子的质量,请告诉我。
-------------编辑-----------------
我想知道是否正在访问if
语句,所以做了一些测试。参见此处:https://pastebin.com/hEtte3MU
只有hello 3
为我回声。 ?
编辑:第一个粘贴框中有一个错字。同样的问题
答案 0 :(得分:0)
**表示要编写echo“ hello”写入console.log(“ hello”); **
可以
答案 1 :(得分:0)
您尝试过吗:
var_dump($_FILES['files']);
代替:
var_dump(_FILES['files'])
或者您可以这样处理:
if(isset($_FILES['files'])){ echo 'there is a least one file'; }
答案 2 :(得分:0)
这里的问题很可能与您的<form/>
标签有关,您需要设置enctype
属性才能上传文件...
<form method="post" enctype="multipart/form-data">
<div id='count'></div>
<input type='file' name='files' multiple />
<input type='button' value='Upload Files' />
</form>
编辑:回顾您的代码,必须在处理上传的js部分中指定enctype
,您需要添加:
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
之前:
xhr.send( payload );
答案 3 :(得分:0)
花一些时间来了解什么是AJAX以及如何在PHP中使用它,这将变得有意义。我将尝试概述页面上发生的情况以及为什么看不到PHP的输出却可以看到最新上传的文件。
您每次提交表单时,页面上的JavaScript都会发出单独的POST
请求。 POST
请求与您当前页面的URL相同,但这是一个完全独立的请求。有点像在同一页面上打开两个窗口。因此$_SERVER['REQUEST_METHOD']
不会在您正在查看的页面上更新,并且您将永远不会看到测试的输出。
您应该做的是将POST
逻辑与其自己的文件分开,并向其发出AJAX请求,而不是将其全部包含在一页上。这将帮助您理解和维护代码。