Проблемы с загрузкой файла PHP - Невозможно переместить загруженный файл

Я пытаюсь загрузить изображение в базу данных и получаю следующее сообщение об ошибке PHP:

Предупреждение: move_uploaded_file(/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg): не удалось открыть поток: нет такого файла или каталога в C:\xampp\htdocs\learnphp\gettingstarted.php в строке 51

Предупреждение: move_uploaded_file(): невозможно переместить 'C:\xampp\tmp\phpA9E6.tmp' в '/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg' в 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>

Пожалуйста, любая помощь будет очень благодарна.

3 ответа

Решение

PHP пытается переместить загруженный файл в несуществующую папку:

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

Путь "/ Upload" не похож на правильный путь Windows. Измените его на что-то вроде "C:\xampp\htdocs\learnphp\upload". Создайте эту папку вручную, если она не существует.

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

Причина, по которой вы получаете ошибку при загрузке, заключается в том, что сама папка не существует; по крайней мере, это впечатление, которое я получаю от этого и, честно говоря, мы не знаем, если efc5ad334bca9f31b19d85a6cc2ada57 существует или нет.

Sidenote: Использование file_exists() который упоминается ниже в этом ответе.

  • Поскольку вы используете сеансы для $logged_user как массив имени пользователя, убедитесь, что сессия была запущена во всех файлах с использованием сессий. session_start(); должны находиться внутри всех файлов и в верхней части вашего кода.

Рекомендуется проверить, установлен ли сеанс с помощью isset() или же !empty(),

Рекомендации:

Если нет (что я уверен, что это не так), вам сначала нужно создать его с помощью mkdir() функция.

Синтаксис: mkdir("/path/to/my/dir", 0700); - 0700 можно изменить на 0755 которая является обычной настройкой для папок, и она должна быть настроена так, чтобы в нее можно было записывать, используя chmod.

Синтаксис один из 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() для этого, иначе это не сработает; вы получите синтаксическую ошибку.

Ссылка:

Поэтому продолжайте использовать отчеты об ошибках, пока не сможете выяснить, где могут возникнуть проблемы.

Добавьте отчет об ошибках в начало файла (ов), который поможет найти ошибки.

<?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

Sidenote: Отображать ошибки следует только при постановке, а не при производстве.

Также добавьте or die(mysqli_error($con)) в $query = mysqli_query($con,$sql); проверить на ошибки базы данных.

Ссылка:

Дополнительная ссылка:

Примечания:

Ваш код в его нынешнем состоянии открыт для SQL-инъекций. Используйте готовое утверждение

Рекомендации:

Я верю, что дал вам достаточно информации, чтобы указать вам правильное направление, которое будет и надежда приведет вас к успеху, ура!

Замените свой $moveResult оператор со следующими двумя инструкциями, поскольку вы должны хранить файл в папке с конкретным именем.

$destination = "./".$_FILES['avator']['name'];

$moveResult = move_uploaded_file( $_FILES['avator']['tmp_name'],$destination);
Другие вопросы по тегам