file_exists дает ложные результаты на сервере хостинга - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь загрузить файл .pdf, используя форму, и при проверке, существует ли файл или нет, результат всегда верен, даже если в каталоге нет файла.

Форма HTML:

<form id="contactForm" method="post" autocomplete="off" enctype="multipart/form-data">
          <input autocomplete="false" name="hidden" type="text" style="display:none;">
          <div class="row">
            <div class="col-md-12 form-group">
              <label for="name">Name</label>
              <input type="text" name="name" class="form-control form-control-lg" id="name" required autocomplete="off">
            </div>
          </div>
          <div class="row">
            <div class="col-md-12 form-group">
              <label for="email">Email</label>
              <input type="email" name="email" id="email" class="form-control form-control-lg" autocomplete="off">
            </div>
          </div>
          <div class="row">
            <div class="col-md-12 form-group">
              <label for="email">Phone</label>
              <input type="number" name="phone" id="phone" class="form-control form-control-lg" required autocomplete="off">
            </div>
          </div>
          <div class="row">
            <div class="col-md-12 form-group">
              <label for="address">Address</label>
              <textarea name="address" id="address" class="form-control form-control-lg" cols="30" rows="8" autocomplete="off"></textarea>
            </div>
          </div>
          <div class="row">
            <div class="col-md-12 form-group">
              <label for="department">Department</label>
              <select class="form-control form-control-lg" name="department" required autocomplete="off">
                <option value="so">Select Department</option>
                <option value="Accounts">Accounts</option>
                <option value="Machine Handling">Machine Handling</option>
                <option value="Marketing">Marketing</option>
                <option value="Sales Development">Sales Development</option>
                <option value="Floor Manager">Floor Manager</option>
                <option value="After Sales Service Manager">After Sales Service Manager</option>
              </select>
            </div>
          </div>
          <div class="row">
            <div class="col-md-12 form-group">
              <label for="file">Upload Your Resume (.pdf only!)</label>
              <input type="file" name="fileToUpload" required autocomplete="off" class="form-control" accept="application/pdf">
            </div>
          </div>
          <div class="row">
            <div class="col-md-6 form-group">
              <input type="submit" name="submit" value="Send Message" class="btn btn-primary btn-lg btn-block">
            </div>
          </div>
        </form>

СЦЕНАРИЙ ПРЕДСТАВЛЕНИЯ ФОРМЫ:

<script>
$("#contactForm").submit(function(e){
  e.preventDefault();
  var form_data = $(this).serialize();
  $('input[type="submit"]').val("Sending Message...");
  $.ajax({
    type: "POST",
    url: "backend/career.php",
    dataType: "json",
    data: form_data
  }).done(function (data){
    console.log(data);
    $('input[type="submit"]').removeClass('btn-primary');
    $('input[type="submit"]').addClass('btn-success');
    $('input[type="submit"]').val("Message Sent...");
    $("#contactForm").closest('form').find("input[type='text'],input[type='number'],input[type='email'],input[type='file'], textarea, select").val("");
  }).fail(function(data){
    console.log(data);
    $('input[type="submit"]').removeClass('btn-primary');
    $('input[type="submit"]').addClass('btn-danger');
    $('input[type="submit"]').val("Sending Failed...");
    $("#contactForm").closest('form').find("input[type='text'],input[type='number'],input[type='email'],input[type='file'], textarea, select").val("");
  });
});
  </script>

Код PHP:

$target_dir = "../pdf/";
$target_file = $target_dir.basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$pdfFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if (file_exists($target_file)) {
  echo "Sorry, file already exists.";
  $uploadOk = 0;
}
if ($_FILES["fileToUpload"]["name"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}
if ($uploadOk == 0) {
  echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
}

Вывод:

Sorry, file already exists.Sorry, your file was not uploaded.

Это вывод, даже еслив этом каталоге нет файлов.

Как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Если var_dump($target_file); возвращает /home/aadhunik/public_html/pdf, file_exists проверяет, существует ли этот каталог /pdf/, что он и делает.

Кажется, проблема в том, что $_FILES["fileToUpload"]["name"] не установлен.

Я бы начал отладку с проверки $_FILES с помощью var_dump($_FILES); - выясните, где это имя файла на самом деле.

Причин может быть много, но это не проблема с file_exists

Если $_FILES пусто, проверьте, что форма имеет enctype="multipart/form-data" и что загрузка файлов разрешена на сервер (в php.ini у вас должно быть file_uploads=1. Если он не пустой, настройте вашкод для использования правильных данных, например, $_FILES['some_file']['name']

Обновление:

Таким образом, вы не можете загружать файлы с помощью ajax. Используйте новый HTML5 FormDataобъект вместо сериализации JQuery. См. эту ссылку для получения дополнительной информации: Как я могу загружать файлы асинхронно?

Имейте в виду, что это поддерживается только в новых браузерах. Некоторые предлагают использовать iFrames или одиниз множества библиотек, доступных для этого. JQuery Ajax File Upload

Примерно так:

<script>
  $("#contactForm").submit(function(e){
    e.preventDefault();
    $('input[type="submit"]').val("Sending Message...");
    $.ajax({
      type: "POST",
      url: "backend/career.php",
      data: new FormData($(this)[0]),
      cache: false,
      contentType: false,
      processData: false
    }).done(function (data){
      console.log(data);
      $('input[type="submit"]').removeClass('btn-primary');
      $('input[type="submit"]').addClass('btn-success');
      $('input[type="submit"]').val("Message Sent...");
      $("#contactForm").closest('form').find("input[type='text'],input[type='number'],input[type='email'],input[type='file'], textarea, select").val("");
    }).fail(function(data){
      console.log(data);
      $('input[type="submit"]').removeClass('btn-primary');
      $('input[type="submit"]').addClass('btn-danger');
      $('input[type="submit"]').val("Sending Failed...");
      $("#contactForm").closest('form').find("input[type='text'],input[type='number'],input[type='email'],input[type='file'], textarea, select").val("");
    });
  });
</script>
0 голосов
/ 31 мая 2018
data: new FormData($(this).get(0))

Это редактирование, которое я должен был выполнить для ajax-кода, чтобы загрузить файл.

if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $target_dir.$target_file)) {

Это изменение, которое мне пришлось внести в код PHP

0 голосов
/ 30 мая 2018

Попробуйте вместо этого использовать абсолютный путь с file_exists

$target_dir = realpath('../pdf');
...