Получить переименованное имя файла в PHP

Можно ли получить переименованное имя файла в 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) 
    } 
}

Я немного удивлен, что это не сработало, для меня все нормально на бумаге (без того, чтобы я повернул / не тестировал)

Scuzzy 03.08.2018 14:44

Move_uploaded_file работает должным образом? Может быть, столбец «изображение» недостаточно велик?

sanderbee 03.08.2018 14:46

На самом деле, это дает мне ошибки, такие как undefined index: file, undefined index: name и т. д. Но и загрузка тоже. Я использую загрузку файла jquery (через ajax)

Nihat Özyedi 03.08.2018 14:48

var_dump ($ newfilename); дает мне: строка (23) "[email protected]." в конце концов, вы видите, что есть точка "." но не расширение

Nihat Özyedi 03.08.2018 14:50

@IncredibleHat, я отредактировал свой пост. У меня тоже contentype: false ..

Nihat Özyedi 03.08.2018 14:55

@sanderbee да move_uploaded_file работает четко. Он перемещает мой файл в целевой каталог.

Nihat Özyedi 03.08.2018 14:56

@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)}}

Nihat Özyedi 03.08.2018 14:57

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

IncredibleHat 03.08.2018 15:05

@IncredibleHat Mee тоже. Но это интересно: если я напишу echo $ newfilename; он дает мне переименованное имя файла и расширение :), но если я использую его в запросе, он не дает мне .extension. Так странно

Nihat Özyedi 03.08.2018 15:09

Возможно, у меня проблема с моим запросом; как вы знаете, адрес электронной почты, например, [email protected] ... если я хочу изменить его на имя изображения; это будет [email protected] Может быть, есть какая-то ошибка с частью .com.ext. Но я не уверен

Nihat Özyedi 03.08.2018 15:12

Итак, изображение сохраняется, повторяя новое имя файла правильно ... за исключением того, что в самом поле базы данных отсутствует расширение? Думаю, в игру вступает вопрос @sanderbee: может быть, столбец img недостаточно велик? Кроме того, это стандартное поле varchar, текст или что-то еще?

IncredibleHat 03.08.2018 15:14

в моей базе данных mysql: столбец img - varchar -> Длина - 200. Я думаю, что этого достаточно

Nihat Özyedi 03.08.2018 15:16
"UPDATE users SET img ='$newfilename' WHERE email = '$user[email]'" ... если это вообще работает, должно работать. Поле электронной почты было бы схематичным, поскольку переменная используется неправильно ... но поле img должно быть точно таким, как вы видите в эхо. Если вы используете подготовленный оператор, он может работать лучше. Но ошибки и ситуации, которые вы описали ... не могут все происходить вместе (если индексы являются ошибкой undefined, нет возможности использовать значения в этих неопределенных индексах). Извините ... У меня пока нет идей :(
IncredibleHat 03.08.2018 15:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
13
70
1

Ответы 1

Я собирался сделать это комментарием, но он стал слишком длинным, поэтому напишу его как ответ и надеяться Я прав:

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

Это может произойти несколькими способами:

  1. Может быть, вы не препятствуете нормальной отправке после вашего вызова ajax, и обычная отправка отправляется снова, но с неправильной кодировкой формы? (Если ваша страница обновляется после нажатия этой кнопки - это вполне может быть тем, что происходит.)
  2. у вас есть другие вызовы ajax для этого же сценария, устанавливающего другого пользователя свойства, но не изображение аватара.
  3. Дополнение: Другие ошибки тоже могут сделать это, посмотрите на свою сетевую активность в консоли проверки вашего браузера / инструментах разработчика.

Если я прав - следующее должно предотвратить то, что вы видите:

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, он запускает обработку загрузки и обновляет пользователя запись даже если файл не прикреплен к этому конкретному запросу!

Добавление непустой проверки должно предотвратить случайную перезапись правильной записи без расширения.

Другие вопросы по теме