将 formData 发布到 PHP 文件上传脚本

posting formData to PHP script for file upload

不确定为什么我无法将 formData 发送到我的 PHP 脚本。

我以前使用过相同的代码并成功。

这里是 HTML:

<form role="form" id="uploadForm" name="uploadForm" action="index.php" enctype="multipart/form-data" method="post">
  <input type="file" id="file" name="file" />
  <button type="button" id="uploadSubmit" class="btn btn-sm btn-flat btn-primary uploadSubmit">Upload Proforma</button>
 </form>

这里是JavaScript

$('#uploadSubmit').on('click', function(e){
  e.preventDefault();

  var formData = new FormData();
  formData.append("file", document.getElementById('file').files[0]);

  $.ajax({
    url: 'api/uploadDoc.php',
    method: "POST",
    data: formData,
    contentType: false,
    cache: false,
    processData: false,
    success: function(data){
      console.log(data);
    },
    error: function(jqHHR, textStatus, errorThrown){
      console.log('fail: ' + errorThrown);
    }
  });
  return false;
});

这是 PHP uploadDoc.php 脚本:

<?php
  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Allow-Methods: GET, POST');
  header("Access-Control-Allow-Headers: X-Requested-With");

  print_r($_POST); 

?>

我刚刚在 PHP 脚本中添加了 headers,如下所示:

使用 print_r($_POST),我在控制台中只得到一个空白数组,如下所示:

Array
(
)

不确定我做错了什么。

为什么post显示的是空白数组和文件信息或formData?

如何更正此问题以便 PHP 脚本可以检索我正在上传的文件?

您需要使用变量 $_FILES 而不是 $_POST

来获取文件

您可以使用is_uploaded_file. But if you want to retrieve the file contents, simply you can use readfile确认上传文件如下:

if (!is_uploaded_file($_FILES['file']['tmp_name'])) {
  die("Possible file upload attack: filename '". $_FILES['file']['tmp_name'] . "'.");
}

echo "File ". $_FILES['file']['name'] ." uploaded successfully.\n";
echo "Displaying contents\n";

readfile($_FILES['file']['tmp_name']);

我在这里找到了答案:

jQuery AJAX file upload PHP

我将我的 onClick 事件更新为如下内容:

$('#uploadProformaSubmit').on('click', function(e){
  e.preventDefault();

  var file_data = $('#file').prop('files')[0];  // <-- added this
  var form_data = new FormData();                  
  form_data.append('file', file_data);

  $.ajax({
    url: 'api/uploadDoc.php',
    method: "POST",
    type: "post", // <-- added this
    data: formData,
    contentType: false,
    cache: false,
    processData: false,
    success: function(data){
      console.log(data);
    },
    error: function(jqHHR, textStatus, errorThrown){
      console.log('fail: ' + errorThrown);
    }
  });
  return false;
});

在 PHP 脚本中,我可以执行以下操作:

<?php
    if(isset($_FILES['file'])){

    $file = $_FILES['file']['tmp_name'];
    $handle = fopen($file, "r");
    $i = 0;

    echo "this is the file " . $file;
?>

现在正在发布文件。

可能是因为该站点使用的是旧版本的 JQuery (1.8.2.min.js),但我不能确定。