Можно ли получить переименованное имя файла в PHP? Я пробую этот код, но он не дает мне .ext Я думаю, что проблема с моей командой explode. Кто-нибудь может мне помочь?
Вот мой код
$target = '..\img\web\users'.DIRECTORY_SEPARATOR;
if ( 0 < $_FILES['file']['error'] ) {
echo 'Error: ' . $_FILES['file']['error'] . '<br>';
}else{
$temp = explode(".", $_FILES["file"]["name"]);
$newfilename = $user['email'] . '.' . end($temp);
move_uploaded_file($_FILES["file"]["tmp_name"], $target . $newfilename);
$q = "UPDATE users SET img ='$newfilename' WHERE email = '$user[email]'";
$r = mysqli_query($dbc, $q);
}
После этого он дает мне $ newfilename = 'uploaded-file.' в моей таблице sql нет расширения. Где мое расширение :))
Я пытаюсь загрузить файл изображения, меняя его на адрес электронной почты пользователя.
Обновлено: мой ввод такой / и jquery:
<img id = "img" alt = "User Pic" <?php if ($user['img'] == ''){ echo 'src = "img/web/user.png"'; }else{ echo 'src = "img/web/users/'.$user['img'].'"'; } ?> class = "img-circle img-responsive" style = "border:1px solid red; min-width:150px; min-height:150px; max-width:150px; max-height:150px;"><br />
<input id = "avatar" name = "file" type = "file" class = "btn btn-default btn-sm" style = "padding:0px; margin:0px;" autocomplete = "off" accept = "image/x-png,image/gif,image/jpeg">
$('#save_details').on('click', function() {
var file_data = $('#avatar').prop('files')[0];
var form_data = new FormData();
form_data.append('file', file_data);
$.ajax({
url: 'admin/useredit.php', // point to server-side PHP script
dataType: 'text', // what to expect back from the PHP script, if anything
cache: false,
contentType: false,
processData: false,
data: form_data,
type: 'post'
});
});
var_dump из $ _FILES:
array(1) {
["file"]=> array(5) {
["name"]=> string(9) "index.jpg"
["type"]=> string(10) "image/jpeg"
["tmp_name"]=> string(24) "C:\xampp\tmp\php7489.tmp"
["error"]=> int(0)
["size"]=> int(4465)
}
}
Move_uploaded_file работает должным образом? Может быть, столбец «изображение» недостаточно велик?
На самом деле, это дает мне ошибки, такие как undefined index: file, undefined index: name и т. д. Но и загрузка тоже. Я использую загрузку файла jquery (через ajax)
var_dump ($ newfilename); дает мне: строка (23) "[email protected]." в конце концов, вы видите, что есть точка "." но не расширение
@IncredibleHat, я отредактировал свой пост. У меня тоже contentype: false ..
@sanderbee да move_uploaded_file работает четко. Он перемещает мой файл в целевой каталог.
@IncredibleHat var_dump ($ _ FILES); -> массив (1) {["file"] => массив (5) {["name"] => строка (9) "index.jpg" ["type"] => строка (10) "image / jpeg "[" tmp_name "] => строка (24)" C: \ xampp \ tmp \ php7489.tmp "[" error "] => int (0) [" size "] => int (4465)}}
Я действительно сбит с толку, как он выдает ошибки о неопределенных индексах ... но сохраняет файл ... но не захватывает расширение после последней точки. Происходит что-то действительно безумное, и ничто из того, что я вижу в вашем коде, не подсказывает, почему :(
@IncredibleHat Mee тоже. Но это интересно: если я напишу echo $ newfilename; он дает мне переименованное имя файла и расширение :), но если я использую его в запросе, он не дает мне .extension. Так странно
Возможно, у меня проблема с моим запросом; как вы знаете, адрес электронной почты, например, [email protected] ... если я хочу изменить его на имя изображения; это будет [email protected] Может быть, есть какая-то ошибка с частью .com.ext. Но я не уверен
Итак, изображение сохраняется, повторяя новое имя файла правильно ... за исключением того, что в самом поле базы данных отсутствует расширение? Думаю, в игру вступает вопрос @sanderbee: может быть, столбец img недостаточно велик? Кроме того, это стандартное поле varchar, текст или что-то еще?
в моей базе данных mysql: столбец img - varchar -> Длина - 200. Я думаю, что этого достаточно
"UPDATE users SET img ='$newfilename' WHERE email = '$user[email]'" ... если это вообще работает, должно работать. Поле электронной почты было бы схематичным, поскольку переменная используется неправильно ... но поле img должно быть точно таким, как вы видите в эхо. Если вы используете подготовленный оператор, он может работать лучше. Но ошибки и ситуации, которые вы описали ... не могут все происходить вместе (если индексы являются ошибкой undefined, нет возможности использовать значения в этих неопределенных индексах). Извините ... У меня пока нет идей :(






Я собирался сделать это комментарием, но он стал слишком длинным, поэтому напишу его как ответ и надеяться Я прав:
Кажется, происходит то, что у вас есть другой вызов, происходящий в другом месте для этого URL-адреса редактирования, у которого нет изображения, прикрепленного к индексу file.
Это может произойти несколькими способами:
Если я прав - следующее должно предотвратить то, что вы видите:
if (!empty($_FILES['file'])) {
if ( 0 < $_FILES['file']['error'] ) {
echo 'Error: ' . $_FILES['file']['error'] . '<br>';
}else{
$temp = explode(".", $_FILES["file"]["name"]);
$newfilename = $user['email'] . '.' . end($temp);
move_uploaded_file($_FILES["file"]["tmp_name"], $target . $newfilename);
$q = "UPDATE users SET img ='$newfilename' WHERE email = '$user[email]'";
$r = mysqli_query($dbc, $q);
}
}
Опять же, предполагая, что я здесь прав - в дополнительном запросе, где вы не отправляете файл, $_FILES['file']['error'] оценивает как null (и выдает это предупреждение о неопределенном индексе), и поскольку (0 < null) оценивается как false, он запускает обработку загрузки и обновляет пользователя запись даже если файл не прикреплен к этому конкретному запросу!
Добавление непустой проверки должно предотвратить случайную перезапись правильной записи без расширения.
Я немного удивлен, что это не сработало, для меня все нормально на бумаге (без того, чтобы я повернул / не тестировал)