【发布时间】:2015-02-25 22:20:34
【问题描述】:
我正在尝试将一个文件附加到电子邮件中,该电子邮件位于一个 JSON 对象中,该对象正在发布到我的 PHP 脚本中。
发布的 JSON 显示为:
{
data:{
"sendto":"sendto@example.com",
"name":"John Smith",
"contem":"john.smith@example.com",
"mess":"This is a test",
"subj":"Test"
},
file:{
"webkitRelativePath":"",
"lastModified":1389280265000,
"lastModifiedDate":"2014-01-09T15:11:05.000Z",
"name":"test.pdf",
"type":"application/pdf",
"size":6437
}
}
我的 PHP 可以很好地处理所有“数据”属性,但是当我尝试检查文件时,我得到:
Notice: Undefined index: file in My\Website\Location\script.php on line 20
第 20 行是:
$file = $_FILES['file'];
此索引是否未定义,因为它位于 JSON 对象中?
我也试过了:
$file = $_FILES[json_decode(stripslashes($_POST['file']), true)];
考虑到文件在 JSON 对象中,首先需要对其进行解码。但是,这返回了:
Warning: Illegal offset type in My\Website\Location\script.php on line 20
我认为非法偏移的问题与尝试将 $_FILES 设置为 JSON 对象有关,是吗?
当我尝试简单地将 $_POST['file'] 设置到 $_FILES 数组中时:
$file = $_FILES[$_POST['file']];
我收到:
Notice: Undefined index: {"webkitRelativePath":"","lastModified":1389280265000,"lastModifiedDate":"2014-01-09T15:11:05.000Z","name":"test.pdf","type":"application/pdf","size":6437} in My\Website\Location\script.php on line 20
将上传的文件显示为 JSON 对象。
我在这里缺少什么?如何从我的 AJAX 帖子中获取上传的文件?
回答
关于 multiform/form-data 内容类型,我更改了发送表单数据的方式。
而不是使用其中包含文件的对象:
var d = new FormData();
var data = {};
data.sendto = 'sendto@example.com';
data.name = $('#puName').val();
data.contem = $('#puEmail').val();
data.mess = $('#puMess').val();
data.subj = 'User Permissions';
d.append('data', JSON.stringify(data));
$.each($('#puFile')[0].files, function(i, file) {
d.append('file-'+i, file);
});
sendEmail(d);
我直接向 PHP 脚本发送了一个 FormData 对象。
function sendEmail(d){
$.ajax({
url: "script.php",
data: d,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function () {
alert("Cool");
},
error: function (e) {
alert("Not Cool");
}
});
}
FormData 由我的数据的 JSON 对象和选定的文件组成。
然后PHP读取表单数据如下:
$data = json_decode(stripslashes($_POST['data']), true);
$file = $_FILES['file-0'];
现在我的电子邮件发送正确。
【问题讨论】:
-
您的 JSON 格式不正确。测试在jsonlint.com
标签: php ajax post file-upload