загрузка изображений на сервер с помощью справки move_uploaded_file()

#php

#php

Вопрос:

Итак, я здесь пытаюсь больше изучить php и … пытаюсь добавить изображение, которое пользователь будет загружать (аватар) на сервер через move_uploaded_file … о, и я сейчас на WAMP, к вашему сведению.

я читаю книгу…короче говоря, показанный пример не работает. Я погуглил и буквально скопировал несколько подходящих примеров, которые я нашел и до сих пор….ну, чтобы было ясно, независимо от того, написал ли я это или из сети, я могу загрузить имя изображения (вместе с другими значениями) в таблицы в БД, которые я настроил, но само изображение не перемещается в каталог, который я для него настроил.

Я удалил весь код своих приложений в простую таблицу и простой php, чтобы убедиться, что ничего не конфликтует и т.д., И все равно нада.

вот мой html:

 <form method="post" action="testUpload.php" enctype="multipart/form-data">

<input type="hidden" name="MAX_FILE_SIZE" value="32768" >

<table summary="guitarwars lesson" width="500">
        <tr>
            <td>load picture:</td>
            <td><input type="file" name="screenshot" id="screenshot" ></td>
        </tr>
        <tr>
            <td><input type="submit" name="submit" action="submit"></td>
        </tr>
</table>


</form>
  

вот мой php:

 <?php 

$screenshot = $_FILES['screenshot']['name'];
//$destination = "images/user_avatars/$screenshot";
$insertValues = "INSERT INTO testdb(screenshot) VALUES ('$screenshot')";


//---declare connection.
$connect2db = mysqli_connect('127.0.0.1','root','pass','dbname');
if(!$connect2db){
    die("Sorry but theres a connection to database error" . mysqli_error);
} else {

    //pg intro mssg
    echo ' <span style="font-size:25px; color:green;"> --- Link Established with Database ---.<span/><br/><br/>';   
}


// put into db.
if(!empty($screenshot)) {
    $insertData = mysqli_query($connect2db, $insertValues);
    echo 'data submitted. thank you';

        move_uploaded_file ($_FILES['screenshot']['tmp_name'],"images/user_avatars/{$screenshot}");


        echo 'IMAGE UPLOAD COMPLETE';

}
mysqli_close($connect2db);
?>
  

теперь я не получаю ошибку … я на самом деле получаю часть echo «загрузка изображения завершена»…
и, как я уже сказал, с помощью кода приложения я получаю несколько значений И имя изображения, которое проходит и сохраняется в БД, но само изображение, перемещаемое из temp в мое местоположение, не работает.

любые ссылки на советы и т.д., Которые я с радостью ценю. Заранее благодарю вас.

Комментарии:

1. Есть ли каталог, вызываемый images в том же каталоге, что и ваш скрипт, и есть ли каталог, вызываемый user_avatars в этом каталоге изображений? PHP не будет создавать каталоги для вас…

Ответ №1:

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

а) Вы широко открыты для атак с использованием SQL-инъекций. Любой приличный учебник по PHP, который показывает, как работать с базами данных, должен начинаться со стратегий смягчения атак с использованием sql-инъекций.

б) В вашей ошибке с ошибкой подключения используется mysqli_error , которая является неопределенной константой. Вы, вероятно, хотите mysqli_error() , что является вызовом функции

c) Код предполагает, что загрузка завершена успешно. Загрузка может завершиться ошибкой в любой момент, поэтому отсутствие проверки на наличие ошибок — это быстрый путь к выдергиванию волос. Как минимум скрипт должен иметь что-то вроде

 if ($_FILES['screenshot']['error'] !== UPLOAD_ERR_OK) {
   die("Upload failed with error code " . $_FILES['screenshot']['error']);
}
  

Эти коды ошибок определены здесь.

d) Ваш код использует предоставленное пользователем имя файла для сохранения файла на сервере. Ничто не говорит о том, что злоумышленник не может взломать имя файла, чтобы включить информацию о пути, поэтому ваш код фактически позволяет этому неприятному пользователю нацарапать ЛЮБОЙ файл на вашем сервере, к которому процесс веб-сервера имеет доступ на запись. Это ПЛОХО

e) Ваш код также предполагает, что перемещение файла прошло успешно, без проверки на наличие ошибок. Это должно быть в mininum

 $status = move_uploaded_file(...);
if (!$status) {
     die("Move failed!");
}
  

или что-то подобное.

f) Ваш код предполагает, что все запросы к базе данных выполнены успешно. Даже если ваша строка запроса сформирована на 100% идеально (у вас это не так, см. (a) выше), запросы могут завершаться ошибкой по ряду других причин. В bare mininum у вас должно быть:

 $result = mysql_query(...) or die(mysqli_error());
  

Комментарии:

1. отличный совет. я только начал с этого около месяца назад, пытаясь освоить трудный путь. Спасибо

2. Отличный глаз! Самый достаточный ответ, о котором можно подумать.

Ответ №2:

Для начала вы могли бы добавить

  if(!move_uploaded_file(...))
  die('error');
  

Комментарии:

1. Другой распространенной проблемой может быть папка, недоступная для записи. Часто пользователь веб-сервера не является пользователем для загрузки по ftp.

Ответ №3:

если вы замените

 move_uploaded_file ($_FILES['screenshot']['tmp_name'],"images/user_avatars/{$screenshot}");


    echo 'IMAGE UPLOAD COMPLETE';
  

с

 if (move_uploaded_file ($_FILES['screenshot']['tmp_name'],"images/user_avatars/{$screenshot}")) {
    echo 'IMAGE UPLOAD COMPLETE';
}
  

затем вы получите echo, если оно было успешным

Комментарии:

1. ваш скриншот больше 32 Кб?

Ответ №4:

Попробуйте указать абсолютный путь:

 move_uploaded_file ($_FILES['screenshot']['tmp_name'],"/path/to/images/user_avatars/{$screenshot}");
  

Комментарии:

1. «Сделайте свой код непереносимым, тогда вы сможете решить свою насущную проблему, но создайте больше, чтобы потом развлекать себя».

2. Вы всегда можете настроить абсолютный путь. Даже подключение к MySQL настраивается.

3. Конечно, но если вы сделаете все относительным и ваши пути будут работать должным образом, вам не нужно беспокоиться…