【问题标题】:Storing file input ID inside variable during for loop | PHP在for循环期间将文件输入ID存储在变量中| PHP
【发布时间】:2012-11-16 11:35:38
【问题描述】:

我正在使用以下 HTML 和 PHP 代码将多个图像移动到我的服务器。

有没有办法使用我的代码将特定输入元素与上传的文件相关联?

所以在我的 for 循环中,我可以发现“image_22”中的图像何时被处理。这可以使用我当前的代码吗?

Dream world 会将值 "image_22" 存储在变量 $imageNum 中 :-)

 

这是我目前正在使用的东西的 sn-p...

HTML:

<input id="image_22" name="images[]" type="file"  />
<input id="image_8" name="images[]" type="file"  />  
... 

PHP:

<?php
    if (isset($_POST['Submit'])) {
    $number_of_file_fields = 0;
    $number_of_uploaded_files = 0;
    $number_of_moved_files = 0;
    $uploaded_files = array();
    $upload_directory = dirname(__file__) . '/uploaded/'; //set upload directory


    /**
     * we get a $_FILES['images'] array ,
     * we procee this array while iterating with simple for loop
     * you can check this array by print_r($_FILES['images']);
     */
    for ($i = 0; $i < count($_FILES['images']['name']); $i++) {
        $number_of_file_fields++;
        if ($_FILES['images']['name'][$i] != '') { //check if file field empty or not
            $number_of_uploaded_files++;
            $uploaded_files[] = $_FILES['images']['name'][$i];
            if (move_uploaded_file($_FILES['images']['tmp_name'][$i], $upload_directory . 
    $_FILES['images']['name'][$i])) {
                $number_of_moved_files++;
            }

        }

    }
    echo "Number of File fields created $number_of_file_fields.<br/> ";
    echo "Number of files submitted $number_of_uploaded_files . <br/>";
    echo "Number of successfully moved files $number_of_moved_files . <br/>";
    echo "File Names are <br/>" . implode(',', $uploaded_files);
    }
    ?> 

谢谢!!

【问题讨论】:

    标签: php html file file-upload for-loop


    【解决方案1】:

    在您的 HTML 中,只需将该值包含在 [] 中即可。

    <input id="image_22" name="images[22]" type="file"  />
    <input id="image_8" name="images[8]" type="file"  />  
    

    在您的循环中,使用带索引的foreach 而不是增量 for 循环,这是 PHP 中比增量类型更常见的模式。 $index 将是 [] 中提供的数字:

    // Loop over the ['name'] key in $_FILES['images'] to get all the named indexes
    foreach ($_FILES['images']['name'] as $index => $filename) {
    
      if ($filename != '') {
         // not empty...
         $number_of_uploaded_files++;
    
         // Check for validity (see below)...
    
         // Use the name concatenated with _$index to supply store the index with the filename
         $uploaded_files[] = $filename . "_$index";
         if (move_uploaded_file($_FILES['images']['tmp_name'][$index], $upload_directory . $filename . "_$index")) {
           // successful rename
           $number_of_moved_files++;
         }
      }
    }
    

    请注意,您的脚本目前容易受到路径注入攻击。您必须过滤每个文件的name,以防止包含../ 之类的内容,这可能会强制将文件保存在文件系统的任何位置(可由Web 服务器写入)!建议使用可接受值的正则表达式检查名称:

    // Verify that the uploaded filename contains only letters, numbers, hyphen, underscore, space before the `.` and letters only after the `.`
    // You could also insist that it end in `.(jpg|gif|png)` or whatever your acceptable formats are
    // Most important is to prevent things like `../`
    if (preg_match('/^[a-z0-9_- ]+\.[a-z]+$/i', $filename)) {
      // It's an ok filename
    }
    

    【讨论】:

    • 此外,使用 javascript 您可以将 name 属性更改为与 id 属性相关联。也就是说,提取id的尾数,作为名称的索引。
    • 非常感谢您如此迅速的响应。出于兴趣,如果我在方括号内添加数字会混淆我的 for 循环吗?
    • 关于注入攻击的要点也很重要——我会尽快修复它。幸运的是,我们仍处于开发阶段:)
    • 在这个循环中不是$i,而是$index。并且在循环中,$filename 指的是与 $_FILES['images']['name'][$index] 相同的值
    • 小伙伴们,请拿实时的东西聊天。如果这是为了澄清问题或答案,请使用信息编辑问题和答案。就目前而言,看起来你们两个正在经历一个实时调试会话。 Stack Overflow cmets 不是一个好地方。我将很快检查并清除这些 cmets,因此请将您想要保留的任何信息移至适当的位置。
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2021-11-09
    • 2019-05-20
    相关资源
    最近更新 更多