Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从javascript FormData访问PHP中ajax提交的数据_Javascript_Php_Multipartform Data - Fatal编程技术网

如何从javascript FormData访问PHP中ajax提交的数据

如何从javascript FormData访问PHP中ajax提交的数据,javascript,php,multipartform-data,Javascript,Php,Multipartform Data,我有以下代码可以通过ajax post上传一个文件、一个用户id和一个令牌: HTML表单: <?php foreach($model['all_documents'] as $doc=>$val){ ?> <form enctype="multipart/form-data" class="form"> <input type="hidden" name="_csrf" value="<?=Yii::$app->request->get

我有以下代码可以通过ajax post上传一个文件、一个用户id和一个令牌:

HTML表单:

<?php foreach($model['all_documents'] as $doc=>$val){ ?>
<form enctype="multipart/form-data" class="form">
  <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
  <input type="hidden" name="user_id" value="<?=$model['user_id']?>" />
  <button type="button" class="col-md-7 btn btn-default documentUpload form-control">
    <i class="fa fa-file-image-o"></i> انتخاب اسکن
  </button>
  <input type="file" name="<?=$doc?>" class="documentUpload" style="display: none;" />
  <button class="col-md-4 btn btn-primary form-control submit pull-left">
    <i class="fa fa-upload"></i> آپلود
  </button>
</form>
<?php } ?>
$(".form").submit(function(){
  var formData = new FormData(this);
  console.info(formData); // Shows FormData(), but can't find my stuff in it

  $.ajax({
    url: '<?=Yii::$app->homeUrl?>courier/upload-document',
    type: 'POST',
    data: formData,
    async: false,
    processData: false,
    // beforeSend: function(){
    // },
    success: function(data){
      console.log(data);
    }
  });
  return false;
});
我从chrome的网络响应中得到的信息如下:

Array
(
    [------WebKitFormBoundaryk0378isAjf4Png8L
Content-Disposition:_form-data;_name] => "_csrf"

dy5nWlJFb1U6dwg.FwshCjZ5NANmd1tkFFcdFh8sLgcnQQQxZzwoOA==
------WebKitFormBoundaryk0378isAjf4Png8L
Content-Disposition: form-data; name="user_id"

456
------WebKitFormBoundaryk0378isAjf4Png8L
Content-Disposition: form-data; name="image_url"; filename="avatar3.png"
Content-Type: image/png

�PNG


IHDR����4�PLTE�ɦ!!!�e<"""���r=-�Y<����cB   �����`@��^?����G2�ȥ�R8u>-�K4�aA�[=�D0����Z<�\=�W;�Ƥ�S9�P6�N6����ma�ġ��������Ÿ_>���UF<�Y<��������U:����ͭޏh纥�y@.|B/���ի��I3�~V�jA��ϻ�������Ѵ�m[����oG�L5Ɵ����쩅.,
数组
(
[----WebKitFormBoundaryk0378isAjf4Png8L
内容配置:_form-data;_name]=>“\u csrf”
dy5nWlJFb1U6dwg.FWSHCJZ5NANMD1TFCFH8SLGCNQQXZWOOA==
------WebKitFormBoundaryk0378isAjf4Png8L
内容处置:表单数据;name=“user\u id”
456
------WebKitFormBoundaryk0378isAjf4Png8L
内容配置:表单数据;name=“image\u url”filename=“avatar3.png”
内容类型:图像/png
�巴布亚新几内亚
IHDR����4.�PLTE�ɦ!!!�e使用

因此,您的代码如下所示:

$(".form").submit(function(){
  var formData = $(this).serializeArray();
  console.log(formData);

  $.ajax({
    url: '<?=Yii::$app->homeUrl?>courier/upload-document',
    type: 'POST',
    data: formData,
    async: false,
    processData: false,
    // beforeSend: function(){
    // },
    success: function(data){
      console.log(data);
    }
  });
  return false;
});
更新:

<?php foreach($model['all_documents'] as $doc=>$val){ ?>
<form enctype="multipart/form-data" class="form">
  <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
  <input type="hidden" name="user_id" value="<?=$model['user_id']?>" />
  <button type="button" class="col-md-7 btn btn-default documentUpload form-control">
    <i class="fa fa-file-image-o"></i> انتخاب اسکن
  </button>
  <input type="file" name="<?=$doc?>" class="documentUpload" style="display: none;" />
  <button class="col-md-4 btn btn-primary form-control submit pull-left">
    <i class="fa fa-upload"></i> آپلود
  </button>
</form>
<?php } ?>
$(".form").submit(function(){
  var formData = new FormData(this);
  console.info(formData); // Shows FormData(), but can't find my stuff in it

  $.ajax({
    url: '<?=Yii::$app->homeUrl?>courier/upload-document',
    type: 'POST',
    data: formData,
    async: false,
    processData: false,
    // beforeSend: function(){
    // },
    success: function(data){
      console.log(data);
    }
  });
  return false;
});
serialize()方法不发送文件。 如果需要使用serialize()上载文件,可以获取base64值并将其作为字符串发送。即使是不识别formData()API的旧浏览器也支持serialize()方法。这是此方法的唯一优点

如果您想使用formData()API上载文件,则可以参考以下内容

  • processData
    设置为false可以防止jQuery 自动将数据转换为查询字符串
  • 必须将
    contentType
    设置为false,否则 jQuery将不正确地设置它

  • 也显示html表单。
    。表单
    表示表单类属性被称为
    表单
    。您确定不是指
    表单。提交(函数()
    取而代之???@Akintunde我更新了这个问题!你能直接从html源代码打印吗?需要知道变量结果..删除
    async=false
    这有什么帮助???@Akintunde,
    formData=$(this).serializeArray();
    将使用表单数据创建一个数组。此外,使用e
    控制台.log(formData)检查是否发送了正确的数据;
    。因此,您可以验证并轻松调试代码。我是否将文件与输入数据一起获取?使用serialize()文件信息现在不能通过控制台显示。@AfghanDeveloper,不可以。如果要使用serialize()方法发送文件,需要获取该文件的base64值。否则,必须使用formData()方法API。我已经更新了答案。Lol formData不仅适用于文件类型。你需要弄清楚事实。另外,OP从未提到他使用的是旧浏览器……你需要一些教程,尽管我还需要设置
    缓存:false,
    var formData = $(".form").serialize();
    
    $(".form").submit(function(){
      var formData = $(this).serializeArray();
      console.log(formData);
    
      $.ajax({
        url: '<?=Yii::$app->homeUrl?>courier/upload-document',
        type: 'POST',
        data: formData,
        async: false,
        processData: false,
        // beforeSend: function(){
        // },
        success: function(data){
          console.log(data);
        }
      });
      return false;
    });
    
    $user_id = $_POST['user_id'];
    $docs = $_FILES['image_url'];
    print_r($_POST);
    exit;