PHP - 上传的文件未发送到文件目录

时间:2017-07-25 20:45:33

标签: php file pdo

在我的网站上,我允许用户提交文件,然后将它们发送到数据库和我创建的文件目录devFiles。它发送到数据库很好,但当我发送到目录,它永远不会发送,我得到我创建的错误消息,看看它是否发送。我认为问题在于

if(is_file($dir.'/'.$file_name)==false){
        //code...

       }

但我尝试改变条件,但它没有奏效。所以我想要做的是,将提交的文件发送到手头创建的文件目录。这是我的代码

PHP

$query = "INSERT INTO pack_screenshots(pack_id, file_name, file_tmp)VALUES(:packid, :file_name, :file_tmp)";
$stmtFileUpload = $handler->prepare($query);
$errors = array();

foreach($_FILES['file']['tmp_name'] as $key => $error){

if ($error != UPLOAD_ERR_OK) {
    $errors[] = $_FILES['file']['name'][$key] . ' was not uploaded.';
    continue;
    }

$file_tmp = file_get_contents($_FILES['file']['tmp_name'][$key]);
$file_name = addslashes(trim($_FILES['file']['name'][$key]));
    try{

$stmtFileUpload->bindParam(':packid', $packid, PDO::PARAM_STR);
$stmtFileUpload->bindParam(':file_name', $file_name, PDO::PARAM_STR);
$stmtFileUpload->bindParam(':file_tmp', $file_tmp, PDO::PARAM_STR);

$dir = "devFiles";

if(is_dir($dir)==false){

    mkdir($dir, 0700);
 }

if(is_file($dir.'/'.$file_name)==false){


    if(!move_uploaded_file($file_tmp,$dir.'/'.$file_name)){

               die("File didn't send!");
          }

        }else{

         $_SESSION['invalid'] = true;
        header("Location: developer_invalid.php");
        exit;
        }
        $stmtFileUpload->execute();
        $_SESSION['thankyou'] = true;
        header("Location: developerUpload_thankyou.php");
        exit;
         }catch(PDOException $e){

            $errors[] = $file_name . 'not saved in db.';
            echo $e->getMessage();
                    }
                 }

1 个答案:

答案 0 :(得分:1)

  

PHP文档bool move_uploaded_file(string $ filename,string $ destination)

你做了:

move_uploaded_file($file_tmp,$dir.'/'.$file_name)

move_uploaded_file期望$ file_tmp成为tmp文件的路径,但是你使用了

$file_tmp = file_get_contents($_FILES['file']['tmp_name'][$key]);

所以$ file_tmp不再是路径,而是它自己的内容 因此,要解决上传问题,只需使用tmp文件路径。

if(!move_uploaded_file($_FILES['file']['tmp_name'][$key],$dir.'/'.$file_name)){

此外,您应该删除文件名上的addslashes(),因为它可能会产生意外的结果。相反,您可以使用以下内容清理文件名:

$file_name = preg_replace("/[^a-z0-9\.]/", "_", strtolower($_FILES['file']['name'][$key]));

您还应该考虑在文件名中添加一个随机数,这样用户就不会覆盖具有相同名称的其他用户文件:例如,me.png可能对于头像来说很常见。保存为

会更安全
$filename = strtotime("now")."_me.png";

最后一点,使用is_file()在某些情况下也会导致问题

  

注意:由于PHP的整数类型已签名且许多平台使用32位整数,因此某些文件系统函数可能会为大于2GB的文件返回意外结果。

使用file_exists()代替