【问题标题】:PHP file upload from imput with rename not move the file into the destination folder使用重命名从输入上传PHP文件不会将文件移动到目标文件夹
【发布时间】:2021-09-11 00:00:23
【问题描述】:

我正在尝试用 PHP 编写一个脚本,这是一个基本的文件上传功能。除了move_uploaded_file 命令,一切都已完成,一切正常。所以我的程序简单地说:你可以从你的电脑上传一张图片,它会重命名它并将它上传到我的本地主机/uploads/文件夹,新名称是当前时间。问题是,程序并没有将文件移动到/uploads/文件夹中,而是重命名它,你可以在MYSQL数据库中看到它,因为新的路径和名称是正确的。我正在努力解决这个错误或错误,或者我真的不知道它是什么。 (在重命名功能一切正常之前,您可以将文件上传到/uploads/ 文件夹)。知道我该怎么做吗?

代码:

<?php
$con = mysqli_connect("localhost", "root", "", "dotech");
$target_dir = '/uploads/';
$target_file = $target_dir . basename($_FILES['fileToUpload']['name']);
$target_type = basename($_FILES['fileToUpload']['type']);
$target_ext = strtolower(end(explode('.',$_FILES['fileToUpload']['name'])));
$target_tmp = $_FILES['fileToUpload']['tmp_name'];
$target_size = $_FILES["fileToUpload"]["size"];
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if(!$con) {
  die("Connection failed: " . mysqli_connect_error());
}

$user_id = mysqli_real_escape_string($con, $_POST['cpmsbtndbldsrd']);
$post_text = mysqli_real_escape_string($con, $_POST['user_post_textarea']);
$post_tag = mysqli_real_escape_string($con, $_POST['tag_select']);


if(isset($_POST["create_post"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
      $uploadOk = 1;
    } else {
      $uploadOk = 0;
      header("Location: /p/index.php?id=$user_id&fileupload=invalid_file_type");
      exit();
    }
    if ($uploadOk = 1) {
        $target_file = $target_dir.''.date('YmdHis').'.'.$target_ext;
        $post_file = $target_file;
        move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
        if ($stmt = $con->prepare('INSERT INTO user_posts (user_id, post_desc, post_file, post_file_type, post_file_size, post_tags) VALUES (?, ?, ?, ?, ?, ?)')) {
            $stmt->bind_param('isssis', $user_id, $post_text, $post_file, $target_type, $target_size, $post_tag);
            $stmt->execute();
            header("Location: /p/index.php?id=$user_id&fileupload=success");
            exit();
        } else {
            echo 'Could not prepare statement!';
        }
        $stmt->close();
    }
  }

?>

编辑: 因此,我对代码进行了更改,但出现了新错误,或者我什至不知道该怎么称呼它。顺便说一句,它最终将重命名的文件移动到/uploads/文件夹中,但没有插入到数据库中。

变化:

$tmp = explode('.', $target_name);  // New exploding method
$target_ext = @end($tmp);

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)){
    $stmt = $con->prepare('INSERT INTO user_posts (user_id, post_desc, post_file, post_file_type, post_file_size, post_tags) VALUES (?, ?, ?, ?, ?, ?)');
        $stmt->bind_param('isssis', $user_id, $post_text, $post_file, $target_type, $target_size, $post_tag);
        $stmt->execute();
        header("Location: /p/index.php?id=$user_id&fileupload=success");
        exit();
} else {
    var_dump($_FILES["fileToUpload"]);
}

错误:

【问题讨论】:

  • 旁注:你不应该在这里的任何地方使用 mysqli_real_escape_string,因为你已经在使用准备好的语句。在这种情况下转义数据可能会严重损坏它
  • 无论如何,您在 PHP 中打开了错误和警告吗?如果 Move_uploaded_file 无法正常工作,通常会发出警告。在最坏的情况下,它会返回false,但目前您的代码不会检查它。我注意到您也没有检查实际上传是否有任何错误 - 查看 $_FILES["fileToUpload"]["error"] 会告诉您
  • 另外if ($uploadOk = 1) { 应该是if ($uploadOk == 1) { - == 用于比较,= 用于分配
  • 还有一点——你的 sql 错误处理不一致。您检查 prepare 是否失败,但如果 bind_param 或 execute 失败则不检查 - 它们都可能出错。无需费力地单独检查每一行,只需将 mysqli 设置为自动显示错误消息 - 请参阅stackoverflow.com/a/22662582/5947043。如果您想捕获这些错误(除了在应用程序中使用全局错误处理程序),那么您可以将所有与 mysqli 相关的代码包装在 try/catch 块中。
  • @ADyson 感谢您的建议,我插入了$_FILES["fileToUpload"]["error"] sn-p,它说$target_ext = strtolower(end(explode('.',$_FILES['fileToUpload']['name']))); 部分有问题。错误消息是Only variables should be passed by reference

标签: php mysql file mysqli error-handling


【解决方案1】:

move_uploaded_file()函数会返回操作的结果,所以在插入数据库之前应该检查一下:

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)){
// success
} else {
// try to debug it, var_dump($_FILES["fileToUpload"]); 
// The destination directory must exist, so check if $target_file path is available
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2014-10-12
    相关资源
    最近更新 更多