【问题标题】:Multiple file upload with optional items带有可选项目的多个文件上传
【发布时间】:2021-04-07 19:26:29
【问题描述】:

我有一个包含多个输入的表单,如下所示:

<div id="users">
<input type="text" name="title[]" required>
<input type="file" name="images[]">

<input type="text" name="title[]" required>
<input type="file" name="images[]">

<input type="text" name="title[]" required>
<input type="file" name="images[]">

</div>

<input type="button" value="add new user">
<input type="submit" value="submit">

问题是选择图像是可选的,如果用户没有为任何标题选择任何图像,则发布的数据将如下所示:

title  = ["title1","title2","title3"]
images = [image1.jpg,image3.jpg]

用户数量不固定,用户可以通过单击添加新用户按钮添加任意数量的标题和图像。所以“添加新用户”按钮会向用户 div 添加一对这样的输入:

<input type="text" name="title[]" required>
<input type="file" name="images[]">

有什么方法可以检测文件是否被选中?或为未选择的文件输入发送默认值?如果没有选择文件,我想为图像设置空值,如下所示:

user1:{title="title1",image=image1.jpg}
user2:{title="title2",image=null}
user3:{title="title3",image=image3.jpg}
.
.
.

【问题讨论】:

  • 为他们命名,images[one], images[two]
  • 输入的数量不固定,所以我不能分配这样的名称

标签: php html forms file


【解决方案1】:

您可以检查是否为文件设置了特定索引:

var_dump($_POST['title'][0]);
if (isset($_FILES['images']['tmp_name'][0])) {
    var_dump($_FILES['images']['tmp_name'][0]);
}

【讨论】:

  • 不需要对特定索引进行硬编码,浏览器会以任何一种方式返回数组,但索引正确,PHP中的数组通常以0而不是1开始
  • 你是对的。我编辑答案。我不确定是否发送了空文件输入。但是是的。
  • 问题是,如果您将 image2 留空,则输入将被忽略,并且只会将两个文件发送到服务器 ex: [file1,file3] 所以我无法识别哪个文件设置为空用户将 file1 留空,然后我又有一个包含两个项目的数组!
  • 这不对。尝试转储 $_FILES 变量并查看结构是什么。我测试它以确保每个图像输入的结构都符合预期,即使是空的。 array(1) { ["图像"]=>;数组(5){ [“名称”]=>;数组(3){[0]=>;字符串(0) "" [1]=>;字符串(0) "" [2]=>;字符串(0) "" } ...
  • 在我的情况下,如果我从三个可选文件输入中设置一个文件,我会得到一个长度为 1 的数组。
【解决方案2】:

您所要做的就是处理这 2 个数组并检查每个标题是否有匹配的图像。如果每个标题都没有图片,请用您喜欢的任何内容代替图片名称

<?php
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  
    $output = [];

    foreach( $_POST['title'] as $idx => $title){
      $u = $idx+1;
      $output['user'.$u] = ['title'=>$title, 
                              'images'=> $_POST['images'][$idx] == '' ? 'NULL' : $_POST['images'][$idx]];
    }
    $j = json_encode($output);
    echo $j;
  }

结果

{
    "user1":{"title":"asss","images":"NULL"},
    "user2":{"title":"dd","images":"hammer.jpg"}
}

【讨论】:

  • 问题是,如果用户设置file1为空或file2为空,请求将是一个包含1项的数组,无法知道哪个设置为空。在您的示例中,如果用户设置 image1 并将 image2 留空,那么我将再次拥有一个包含 1 个项目的数组。在这两种情况下 images[1] = file , images[2]=null
【解决方案3】:

谢谢大家,Pavol Velky 部分是对的,虽然数组大小小于输入的数量,但是浏览器会为数组设置索引,例如如果你有两个输入,只选择第二个,数组将类似于:item:[1:{}](如果您选择第一个:item:[{}]),您可以通过索引号检查顺序。

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2023-03-26
    • 2018-03-29
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多