如何从javascript FormData访问PHP中ajax提交的数据
我有以下代码可以通过ajax post上传一个文件、一个用户id和一个令牌: HTML表单:如何从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
<?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;