1

所以我试图一次上传多个文件,但每次我这样做只是为我尝试做的每个文件上传上传循环中的最后一个文件。最终,它只是将一个文件上传到我的服务器,我的数据库中的多个点正在引用。

我曾尝试使用独立函数和变量在循环外执行上传文件函数,但它仍在执行此操作。

我的代码:

<?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']);
            }
        }   
    }
}
?>

我检查了我的表单,以及所有独立命名并匹配的文件字段名称。这不是语法问题,因为检查错误的第一个循环完美无缺。只有当我尝试上传文件时它才会开始覆盖。

任何人都可以启发我吗?(我是一个相当大的菜鸟,所以请尽量保持在新人说话)

** * ** 更新 * ** * ** * ****

所以我现在已经解决了这个问题,下面是工作代码:

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'])));
                if (file_exists($movefile_path) === true) {
                    $file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . substr(md5(rand()),0,10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
                    $movefile_path = $_SERVER['DOCUMENT_ROOT'].$file_path;
                }
                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_path),并有一个绝对路径,php 可以使用它来上传文件($movefile_path)。

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

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

4

1 回答 1

1

您应该重命名您正在上传的文件,永远不要相信用户输入...您可以在图像名称后面放置一个 unix 时间戳或唯一 ID

于 2013-05-17T17:09:35.247 回答