如何使用 php 遍历 FormData

how to loop through FormData using php

我在这里使用 ajax 创建一个 FormData,这样我就可以将一些输入文件发送到 php 脚本,然后我可以将它保存为我的数据库中的 blob。问题是如何在将 FormData 发送到 php 脚本后动态循环遍历 FormData 以便我可以动态获取每个名称并保存用户上传的内容并保留空输入原样

更多解释:

<input id = "Pay_cert1"  type="file" name="" /> 
<input id = "Pay_cert2"  type="file" name="" /> 
<input id = "Pay_cert3"  type="file" name="" /> 
<input id = "Pay_cert4"  type="file" name="" /> 

然后我获取输入值“如果有值”并将其附加到我的数据表

  var Pay_cert1= $('#Pay_cert1').prop('files')[0];   
    var Pay_cert2= $('#Pay_cert2').prop('files')[0];   
    var Pay_cert3= $('#Pay_cert3').prop('files')[0];   
    var Pay_cert4= $('#Pay_cert4').prop('files')[0];   


var form_data = new FormData();                  
if(document.getElementById("Pay_cert1").files.length != 0)
{
form_data.append('Pay_cert1', Pay_cert1); 
}
if(document.getElementById("Pay_cert2").files.length != 0)
{
form_data.append('Pay_cert2', Pay_cert2);
}
if(document.getElementById("Pay_cert3").files.length != 0)
{
form_data.append('Pay_cert3', Pay_cert3);
}
if(document.getElementById("Pay_cert4").files.length != 0)
{
form_data.append('Pay_cert4', Pay_cert4);
}


 $.ajax({
        url: 'Upload.php',
        cache: false,
        contentType: false,
        processData: false,
        data:form_data ,                         
        type: 'post',
       success : function(data) {
   }
     });

这里 PHP 我想在我的 DataForm 上动态循环并获取每个已附加文件的 tmpname,所以 我怎么说

foreach(name in $_FILES['']) // how can I loop here on DataForm and get each tmpname??
{
console.log( $_FILES['name']['tmp_name']); 
}

Foreach 在 php

中看起来像这样

PHP: foreach

这就是 $_FILES 的样子

PHP: $_FILES

因此,在 Upload.php 中,您可以将代码从

foreach(name in $_FILES['']) // how can I loop here on DataForm and get each tmpname??
{
console.log( $_FILES['name']['tmp_name']); 
}

foreach($_FILES as $key => $file ) { // $key is index and $file is item
     echo "this is ".$file['tmp_name'];  // like console.log in js
}

现在您可以对 $_FILES 变量进行交互,这意味着将访问每个 temp_name

如果您要使用 querySelectorAll 查找 所有 文件输入元素,您可以遍历它们并将名称和值分配给 FormData 对象,更清晰比上面显示的方式。

每个文件都可以appended到需要使用array语法命名的变量——即:files[]

使用该变量设置 Ajax 请求(此处为简单起见使用 fetch),然后处理上传的 PHP 代码可以循环使用 $_FILES 集合files 作为名称 - 即:$_FILES['files'] 或您之前在 fd.append('NAME[]',value) 中分配的任何变量。

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_FILES['files'] ) ){
        
        $output=array();
        
        foreach( $_FILES['files']['name'] as $i => $name ) {
        
            if( !empty( $_FILES['files']['tmp_name'][$i] ) ) {
                $name = $_FILES['files']['name'][$i];
                $size = $_FILES['files']['size'][$i];
                $type = $_FILES['files']['type'][$i];
                $tmp  = $_FILES['files']['tmp_name'][$i];
                $error= $_FILES['files']['error'][$i];
                $ext  = pathinfo( $name, PATHINFO_EXTENSION );
                
                # do what you need to save the files and generate some output to send back to the AJAX callback
                $output[]=array(
                    'name'=>$name,
                    'size'=>$size,
                    'type'=>$type,
                    'ext'=>$ext,
                    'date'=>date(DATE_ATOM)
                );
            }
        }
        
        exit( json_encode($output) );
    }
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title></title>
        <style>input{clear:both;display:block;margin:0.5rem 0;padding:0.5rem;}</style>
    </head>
    <body>
    
        <input type="file" name="Pay_cert1" />
        <input type="file" name="Pay_cert2" />
        <input type="file" name="Pay_cert3" />
        <input type="file" name="Pay_cert4" />
        <input type='button' value='Upload' />
        
        <script>
            document.querySelector('input[type="button"]').addEventListener('click',(e)=>{

              let url=location.href;    //'Upload.php';
              let fd = new FormData();

              document.querySelectorAll('input[type="file"][name^="Pay_cert"]').forEach(n => {
                  if ( n.files.length > 0 ) {
                      fd.append( 'files[]', n.files[0], n.name );
                  }
              });
              
              
              fetch( url, { method:'post', body:fd } )
                .then( r=>r.json() )
                .then( json=>{
                  console.log(json)
                })

            });
        </script>
    </body>
</html>