使用php上载多个文件而不覆盖以前的文件

使用php上载多个文件而不覆盖以前的文件,php,file,upload,Php,File,Upload,因此,我试图一次上传多个文件,但每次我这样做,它只是上传循环中我试图上传的每个文件的最后一个文件。最终,只有将一个文件上载到我的服务器,我的数据库中的多个点才会引用该文件 我已经尝试过在循环之外使用独立的函数和变量执行upload file函数,但它仍然在执行 我的代码: <?php $image_number = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); $image_allowed = array('jpg', 'jpeg', 'gif', 'png'

因此,我试图一次上传多个文件,但每次我这样做,它只是上传循环中我试图上传的每个文件的最后一个文件。最终,只有将一个文件上载到我的服务器,我的数据库中的多个点才会引用该文件

我已经尝试过在循环之外使用独立的函数和变量执行upload file函数,但它仍然在执行

我的代码:

<?php $image_number = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$image_allowed = array('jpg', 'jpeg', 'gif', 'png');
if (empty($errors) === true) {
  foreach ($image_number as $value) {
    if (isset($_FILES['story_image_' . $value]) === true) {
        if (empty($_FILES['story_image_' . $value]['name']) === false) {
            if (in_array(strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))), $image_allowed) === false) {
                $errors[] = 'Incorrect file type for \'Story image ' . $value . '\'. Allowed file types: ' . implode(', ', $image_allowed);
            } else if ($_FILES['story_image_' . $value]['size'] > 1048576) {
                $errors[] = 'Story image ' . $value . '\'s file size may not exceed 1 MB, or 1048576 Bytes.';
            }
        }
    }
  }
}

foreach ($image_number as $value) {
    if ($_POST['removeImage' . $value] === 'on') {
        remove_story_image($story_data['story_id'], $value, $story_data['story_image_' . $value]);
    } else {
        if (isset($_FILES['story_image_' . $value]) === true) {
            if (empty($_FILES['story_image_' . $value]['name']) === false) {


                $file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
                $movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
                move_uploaded_file($_FILES['story_image_' . $value]['tmp_name'], $movefile_path);
                mysql_query("UPDATE `stories` SET `story_image_" . $value . "` = '" . mysql_real_escape_string($file_path) . "' WHERE `story_id` = " . $story_data['story_id']);
            }
        }   
    }
}
?>
对于那些将来可能会遇到类似问题并需要简单解释的人(当其他人提供一个解释时,我非常感激),这里简单解释一下问题是什么以及我是如何解决的

问题是,我在循环中迭代的同时进行md5哈希运算,使用以下代码行重写相同的文件名:

$movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
正如您所注意到的,我有两个文件路径。这并不是让任何人感到困惑,而是让我可以上传一个绝对路径到html以后可以引用的数据库($file\u path),并且有一个php可以用来上传文件的绝对路径($movefile\u path)

为了解决这个问题,我进行了循环检查,查看文件是否已经存在,如果已经存在,只需添加一个随机字符串,该字符串在md5哈希时间戳之后进行md5哈希,以生成一个新的唯一文件名。我使用$movefile_path文件路径检查文件是否存在,因为这是php可以使用的路径


我还确保在更新的$movefile_路径中包含更新的$file_path变量,否则重新散列随机字符串会给我一个不同的文件名供html从我的数据库中引用,而不是php上载的实际文件名。

你应该重命名正在上载的文件,永远不要相信用户输入。。。
您可以将unix时间戳或唯一id放在映像名称后面

您应该重命名正在上载的文件,不要相信用户输入。。。
您可以在映像名称后面放置unix时间戳或唯一id

请向我们显示您的表单请向我们显示您的表单我不这样做:
$movefile\u path=$\u SERVER['DOCUMENT\u ROOT']。“/cdsite/images/storyimages/”。substr(md5(time()),0,10)。"." . strtolower(end(分解('.',$文件['story\u image.'.$值]['name']))如果您不想覆盖,请检查文件是否已经存在,如果已经存在,请给它取另一个名称(我想这是您想要的)谢谢您的帮助Nathan。上帝保佑,继续努力!我用上面的工作代码更新了我的问题。我不是用:
$movefile\u path=$\u SERVER['DOCUMENT\u ROOT'].“/cdsite/images/storyimages/”吗。substr(md5(time()),0,10)。"." . strtolower(end(分解('.',$文件['story\u image.'.$值]['name']))如果您不想覆盖,请检查文件是否已经存在,如果已经存在,请给它取另一个名称(我想这是您想要的)谢谢您的帮助Nathan。上帝保佑,继续努力!我用上面的工作代码更新了我的问题。
$movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));