file_exists 在托管服务器上给出错误结果

Posted

技术标签:

【中文标题】file_exists 在托管服务器上给出错误结果【英文标题】:file_exists gives false results on hosting server 【发布时间】:2018-11-09 06:30:32 【问题描述】:

我正在尝试使用表单上传 .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.

即使该目录中不存在任何文件,这也是输出。

如何解决?

【问题讨论】:

$_FILES["fileToUpload"]["name"] 是一个简单的名字,我想basename 在这里没用。 附注:您不想希望以客户端指定的名称存储上传的文件。那是一个安全问题。您为物理文件使用生成的名称,并且仅将指定的名称存储在数据库中,如果您以后需要它。 试试:- $target_file = $target_dir.$_FILES["fileToUpload"]["name"]; 不工作。仍然显示相同的错误@AlivetoDie @arkascha,我正在将文件上传到我的服务器目录。我不想将它保存到我的数据库中。 【参考方案1】:
data: new FormData($(this).get(0))

这是我必须对 ajax 代码进行的编辑才能上传文件。

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

这是我必须在 PHP 代码中做出的改变

【讨论】:

【参考方案2】:

如果var_dump($target_file); 返回/home/aadhunik/public_html/pdffile_exists 正在检查/pdf/ 目录是否存在,它确实存在。

问题似乎是$_FILES["fileToUpload"]["name"]没有设置。

我将通过使用var_dump($_FILES); 检查$_FILES 开始调试 - 找出该文件名的实际位置。

这可能有很多原因 - 但 file_exists 不是问题

如果$_FILES 为空,请检查表单是否有enctype="multipart/form-data",并且服务器上是否允许文件上传(在php.ini 中,您应该有file_uploads=1。如果它不为空,请调整您的代码以使用正确的数据,例如$_FILES['some_file']['name']

更新:

这种方式不能用 ajax 上传文件。使用新的 HTML5 FormData 对象而不是 JQuery 序列化。有关更多信息,请参阅此链接: How can I upload files asynchronously?

请记住,这仅在较新的浏览器上受支持。一些人建议使用 iFrame 或许多可用的库之一。 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>

【讨论】:

我已经在表单中包含了 enctype。文件上传了一次,之后就没有上传了 如果$_FILES 为空,这就是您需要解决的问题 - 请包含您的表单 - 并确保在服务器上的 PHP 配置中启用文件上传:file_uploads=1 file_uploads 已开启。我在服务器上使用 5.6 版本的 PHP 可以$(this).serialize(); 删除/清除$_FILE 变量吗?应该是$(this)[0]; 我从 $(this).serialize();到 $(this)[0]。我收到了超出最大调用堆栈大小的错误【参考方案3】:

试试这个,使用带有 file_exists

的绝对路径
$target_dir = realpath('../pdf');

【讨论】:

以上是关于file_exists 在托管服务器上给出错误结果的主要内容,如果未能解决你的问题,请参考以下文章

从 JQuery 调用 WCF 服务:跨域 OPTIONS 请求给出错误 400

file_exists() 不起作用,但是当在浏览器中给出图像的 url 时,会显示图像

Nodemailer /发送给出404错误

组件在 localhost 中加载,但在 live 上给出内部服务器错误:joomla

File_exists 功能不起作用

301 重定向规则在不同的托管环境下给出不同的结果