Проблемы с загрузкой файла 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()
,
Рекомендации:
- 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()
функция.
Синтаксис: 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);
проверить на ошибки базы данных.
Ссылка:
Дополнительная ссылка:
- http://php.net/manual/en/function.file-exists.php (проверьте, существует ли файл / папка)
Примечания:
Ваш код в его нынешнем состоянии открыт для SQL-инъекций. Используйте готовое утверждение
Рекомендации:
Я верю, что дал вам достаточно информации, чтобы указать вам правильное направление, которое будет и надежда приведет вас к успеху, ура!
Замените свой $moveResult
оператор со следующими двумя инструкциями, поскольку вы должны хранить файл в папке с конкретным именем.
$destination = "./".$_FILES['avator']['name'];
$moveResult = move_uploaded_file( $_FILES['avator']['tmp_name'],$destination);