PHP 文件上传问题 - 无法移动上传的文件


PHP file upload Issues - Can't Move uploaded File

我正在尝试将图像上传到数据库并收到此PHP错误消息:

警告:move_uploaded_file(/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg(:无法打开流:在第51行的C:''xampp''htdocs''learnphp''gettingstarted.php中没有这样的文件或目录

警告:move_uploaded_file((:无法将 C:''xampp''tmp''phpA9E6.tmp' 移动到 '/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg' 在第 51 行的 C:''xampp''htdocs''learnphp''gettingstarted.php 上传失败。

这是我的 php 脚本:

<?php
require("include/functions.php");
check_session();
$logged_user = $_SESSION['username'];
if(isset($_FILES['avator']['name']) && $_FILES['avator']['tmp_name'] !=""){

    //setting file properties
    $fileName = $_FILES['avator']['name'];
    $filetmpLoc = $_FILES['avator']['tmp_name'];
    $fileType = $_FILES['avator']['type'];
    $filesize = $_FILES['avator']['size'];
    $fileErrMsg = $_FILES['avator']['error'];
    //explose the filename extention into an array
    $kaboom = explode('.',$fileName);
    $fileExt = end($kaboom);
    list($width ,$height) = getimagesize($filetmpLoc);
    if( $width <10 || $height <10 ){
        //the image has not dimenssion
        echo 'The Image has no dimension.Try again!';
        exit();

        }else{
            // The image is has dimension so its OK
            $db_file_name = rand(100000000000,999999999999).".".$fileExt;
            //check the size of the image
            if($filesize > 1048576){
                echo 'Your avator file size was larger than 1mb.';
                exit();
                }else if(!preg_match('/'.(gif|png|jpg)$/i',$fileName)){
                    echo"Your avator file was not JPG,PNG or GIF type.Try again.";
                    exit();
                    }else if($fileErrMsg == 1){
                        echo "Unknoan Error occured. Upload Fail.";
                        exit();
                        }

                        //move uploaded avator
                $moveResult = move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name");
                if( $moveResult !=true){
                    echo 'Upload Fail.';
                    exit();
                    }else{
                        //resize the image
                        include_once("include/resizeimage.php");
                        $target_file = "user/$logged_user/$db_file_name";
                        $resize_file ="user/$logged_user/$db_file_name";
                        $wmax = 200;
                        $hmax = 230;
                        img_resize($target_file,$resize_file,$wmax,$hmax,$fileExt);
                        $sql = "UPDATE mygust SET avatar = '$db_file_name' WHERE username='$logged_user' LIMIT 1";
                        $query = mysqli_query($con,$sql);
                        mysqli_close($con);
                        exit();

                        }

            }

    }
 ?>

我的 HTML 代码是:

   <form id="u_pro_pic" method="post" enctype="multipart/form-data" onSubmit="" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
<h2>Set your Profile Avator</h2><br>
<div id="av_wrap"><div id="avator_div"><img src="image/blank-profile.png" class="avator" title="Chose a file to upload"  onClick="triggerUpload(event,'avator')"></div>
<div id="ad_clarleft">
<input type="button" class="add" title="Choose a file to upload"  onClick="triggerUpload(event,'avator')" value="Add Avator"><br>
<hr>
<p>These brethren have uploaded their's and you should too. </p>
</div>
</div>

<input name="avator" type="file" id="avator" form="u_pro_pic" onChange="readURL(this)">
<input type="submit" name="u_avator" id="sumit" class="avt" value="Upload">
</form>

请任何帮助将不胜感激。

PHP 会尝试将您上传的文件移动到不存在的文件夹中:

//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name");
路径

"/upload"看起来不像正确的窗口路径。将其更改为类似"C:''xampp''htdocs''learnphp''upload"的内容。如果此文件夹不存在,请手动创建此文件夹。

//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"C:/xampp/htdocs/learnphp/upload/$logged_user/$db_file_name");

您在上传时收到错误的原因是文件夹本身不存在; 至少这是我从中得到的印象,老实说,我们不知道efc5ad334bca9f31b19d85a6cc2ada57是否存在。

旁注:使用本答案中进一步引用的file_exists()

  • 由于您使用会话作为用户名会话数组$logged_user,因此请确保会话已使用会话在所有文件中启动。 session_start();必须驻留在所有文件中,并且位于代码的顶部。

最好检查会话是否也使用 isset()!empty() 进行设置。

引用:

  • http://php.net/manual/en/function.session-start.php
  • http://php.net/manual/en/function.isset.php
  • http://php.net/manual/en/function.empty.php

如果没有(我很确定它没有(,您首先需要使用 mkdir() 函数创建它。

  • http://php.net/manual/en/function.mkdir.php

语法是:mkdir("/path/to/my/dir", 0700); - 0700可以更改为0755这是文件夹的常用设置,必须对其进行设置,以便可以使用chmod写入文件夹。

  • http://php.net/manual/en/function.chmod.php

语法是手册中列出的 3 种语法之一:

chmod("/somedir/somefile", 755);   // decimal; probably incorrect
chmod("/somedir/somefile", "u+rwx,go+rx"); // string; incorrect
chmod("/somedir/somefile", 0755);  // octal; correct value of mode

因此,您需要在会话文件之后使用mkdir()函数,然后将其"移动"到由$logged_user及其关联名称创建的文件夹。

即:

mkdir("/path/to/your/dir", 0700); // you can use variables here
$moveResult = move_uploaded_file(...);

代码的这一部分/upload/建议使用完整的服务器路径语法。

move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name")

您可以使用完整的服务器路径,例如:

/var/usr/public/upload/

或如另一个答案中引用的C:/xampp/htdocs/learnphp/upload/

或相对路径:

即:

upload/../upload/取决于脚本的执行位置。前者是从公共区域的根部执行的。

Nota:我不确定-416649605.jpg是上传的实际文件名,还是连字符前缺少任何内容,或者连字符是否被添加到某处。你需要研究一下。

从我的评论中提取:

现在,如果你打算使用一个 BLOB,它可能不够大,可能必须使用 LONGBLOB https://dev.mysql.com/doc/refman/5.0/en/blob.html。

但是,当使用 BLOB 直接插入数据库时,您必须为此使用 mysqli_real_escape_string(),否则它将不起作用;您将收到一个语法错误。

参考:

  • http://php.net/manual/en/mysqli.real-escape-string.php

因此,请继续使用错误报告,直到您可以找出问题可能发生的位置。

将错误报告添加到文件顶部,这将有助于查找错误

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);
// if using MySQL
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// rest of your code

旁注:显示错误只能在暂存中完成,而不应在生产中完成。

此外,将or die(mysqli_error($con))添加到$query = mysqli_query($con,$sql);以检查数据库错误。

参考:

  • http://php.net/manual/en/mysqli.error.php

附加参考:

  • http://php.net/manual/en/function.file-exists.php(检查文件/文件夹是否存在(

脚注:

处于当前状态的代码可以进行 SQL 注入。使用预准备语句

引用:

  • https://en.wikipedia.org/wiki/Prepared_statement
  • 如何防止 PHP 中的 SQL 注入?

我相信我已经给了你足够的信息,以便为你指出正确的方向,这将和希望将引导你走向成功,干杯!

$moveResult语句替换为以下两个语句,因为您必须将文件存储在具有特定名称的文件夹中。

$destination = "./".$_FILES['avator']['name'];
$moveResult = move_uploaded_file( $_FILES['avator']['tmp_name'],$destination);