【问题标题】:Uploading multiple images PHP上传多张图片 PHP
【发布时间】:2023-04-05 19:43:01
【问题描述】:

我正在尝试上传多张图片和图片说明,但似乎无法弄清楚为什么它无法正常工作。

我有一个表格,在该表格中有一个如下所示的表格:

<div id="section_photos">
    <fieldset>
        <table id="photo_table">
            <thead>
                <tr>
                    <th>Roof Section Photo</th>
                    <th>Photo Description</th>
                </tr>
            </thead>
            <tbody id="photo_tb">
                <tr>
                    <td><input type="file" id="roof_section_photo" name="roof_section_photo[]" /></td>
                    <td><input id="section_photo_desc" type="text" name="section_photo_desc[]"/></td> 
                </tr>
            </tbody>
        </table>
        <input type="button" value="Add Photo" id="newSectionPhoto" />
    </fieldset>
</div>

此处的按钮只会在表格中添加与&lt;tbody&gt; 中的&lt;tr&gt; 相同的另一行,允许用户添加多个带有描述的图像。

当用户单击我的表单提交按钮时,它将尝试遍历每张照片并将图像上传到我网站中的图像目录,并将目录路径和描述信息插入 MySQL 数据库。

$sectionPhoto = "../images/". $selectedAssocAccount ."/" . $facilityID . "/"
                . basename($_FILES["roof_section_photo"]["name"]); 

foreach($_FILES['roof_section_photo']['name'] as $index => $image){
    $sectionPhotoDesc = $_POST['section_photo_desc'][$index];

    if($_FILES['roof_section_photo']['error'] == UPLOAD_ERR_OK) {
        $status_msg = '';
        $from = $_FILES["roof_section_photo"]["tmp_name"];
        $saved = save_section_photo($from, $sectionPhoto, $status_msg);

        $sectionPhotoQuery = "INSERT INTO table(facility_section_information_id, photo, photo_desc) "
                . "VALUES ('$facilitySectionID', '$image', '$sectionPhotoDesc')";

        //using this to test my query before I submit anything
        echo $sectionPhotoQuery; 
        echo "</br>";

        //mysqli_query($dbc, $sectionPhotoQuery)or die(mysqli_error($dbc));

    } else{
        //THIS IS WHERE I KEEP HITTING..
        echo "Error uploading photo. " . $_FILES['roof_section_photo']['error'];  
    }
}

输出: 上传照片时出错。数组

假设我有 3 张图片,我会收到 3 次错误消息,所以我知道至少每张图片都被放入一个数组并且正在迭代。

(我认为我不需要发布我的 save_section_photo() 函数,因为它甚至没有那么远。)

我正在使用完全相同的过程在其他地方仅上传单个图像而没有任何问题,但是当我尝试以这种方式使用它时似乎给我带来了问题。

我很困惑为什么我一直中断我的if 声明,我使用的图像都是小尺寸的,.jpg 的我也在其他地方用于测试。

有什么想法吗?

谢谢

编辑

我在foreach 循环之前包含了var_dump( $_FILES['roof_section_photo'] );

输出

array(5) { ["name"]=> array(2) { [0]=> string(12) "einstein.jpg" [1]=> string(10) "monkey.jpg" } ["type"]=> array(2) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" } ["tmp_name"]=> array(2) { [0]=> string(14) "/tmp/php89CrOW" [1]=> string(14) "/tmp/phpPGz7Z9" } ["error"]=> array(2) { [0]=> int(0) [1]=> int(0) } ["size"]=> array(2) { [0]=> int(4798) [1]=> int(3254) } }

【问题讨论】:

  • 您的表单是否包含 POST 方法和有效的 enctype?您的问题中没有显示。
  • @Fred-ii- 是的,我的表单标签中有enctype="multipart/form-data" method="post"
  • 您是否查看过文件是否确实已成功上传? Web 服务器用户是否允许将它们上传到的目录写入?文件大小是否在 php.ini 设置范围内(或出于任何其他原因超出范围)?也许将您的错误行更改为echo "Error uploading photo. " . $_FILES['roof_section_photo']['error'];,这样您就可以看到它实际上是什么错误。
  • @BA_Webimax 他们根本没有被上传。是的,该目录允许由 Web 服务器用户写入。我已更改错误消息并将我的输出包含在我的答案中。
  • 您应该var_dump($_FILES) 来查看您返回的内容。我希望$_FILES['roof_section_photo']['error'] 是一个数组,并且您需要在if 之前增加一个计数器。类似$_FILES['roof_section_photo']['error'][$i]

标签: php html image


【解决方案1】:

好的,我想这对你有用...

foreach($_FILES['roof_section_photo']['name'] as $index => $image){
    $sectionPhotoDesc = $_POST['section_photo_desc'][$index];

    if($_FILES['roof_section_photo']['error'][$index] == UPLOAD_ERR_OK) {
        $status_msg = '';
        $from = $_FILES["roof_section_photo"]["tmp_name"][$index];
        $saved = save_section_photo($from, $sectionPhoto, $status_msg);

        $sectionPhotoQuery = "INSERT INTO table(facility_section_information_id, photo, photo_desc) "
                . "VALUES ('$facilitySectionID', '$image', '$sectionPhotoDesc')";

        //using this to test my query before I submit anything
        echo $sectionPhotoQuery;
        echo "</br>";

        //mysqli_query($dbc, $sectionPhotoQuery)or die(mysqli_error($dbc));

    } else{
        //THIS IS WHERE I KEEP HITTING..
        echo "Error uploading photo. " . $_FILES['roof_section_photo']['error'][$index];
    }
}

由于您在 $_FILES['roof_section_photo']['name'] 数组上循环,该数组与 $_FILES['roof_section_photo'] 数组不同,后者是一个由 5 个数组组成的数组,每个数组有两个元素。您需要确保为它们使用正确的索引。

【讨论】:

  • 我应该在$_FILES['roof_section_photo'] 上循环播放,还是我在做什么? ..我现在要测试一下,谢谢
  • (可选)您可以使用 HTML/JS 创建索引,方法是使用这种方式创建字段&lt;input type="file" class="roof_section_photo" name="roof_section_photo[0]" /&gt;(根据您拥有的数量递增它们)。然后你可以在$_FILES['roof_section_photo'] 上循环。您可能需要将 id 设为 class,以便您可以使用 jQuery 或您选择的框架对它们进行计数和索引。顺便说一句,一个页面上相同id 的多个实例是不好的做法,可能会导致 JS 出现问题。
  • 嗯好吧,我想我明白了。是的,我知道id 的重复很糟糕,这是我要解决的下一个任务。感谢大家的帮助,真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多