PHP | HTML-调试文件上传器

时间:2018-09-17 18:41:36

标签: javascript php html

我有以下代码:

<?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为我回声。 ?

编辑:第一个粘贴框中有一个错字。同样的问题

https://pastebin.com/5Gka3UQH

4 个答案:

答案 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请求,而不是将其全部包含在一页上。这将帮助您理解和维护代码。