我正在尝试将文件附加到发布到我的PHP脚本的JSON对象内部的电子邮件中。
发布的JSON显示为:
{
data:{
"sendto":"[email protected]",
"name":"John Smith",
"contem":"[email protected]",
"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帖子中获取上传的文件?
回答
如关于多表单/表单数据内容类型的说明,我更改了发送表单数据的方式。
而不是使用其中包含文件的对象:
var d = new FormData();
var data = {};
data.sendto = '[email protected]';
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);
我将FormData对象直接发送到PHP脚本。
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对象和选定的File组成。
PHP然后读取如下形式的数据:
$data = json_decode(stripslashes($_POST['data']), true);
$file = $_FILES['file-0'];
现在,我的电子邮件已正确发送。
$_FILES
仅当multipart/form-data
为POST设置content-type时,才会创建superglobal,并且将包括要发布的实际文件,而不是对该文件的本地引用。相反,您正在发送JSON请求(希望具有适当的application/json
内容类型)。这不会填充$_FILES
。除非您的接收脚本能够获取提供的路径信息并访问有问题的文件,否则您的POSTing脚本实际上将需要将文件作为POST的一部分发送。
最好使用特定的AJAX上传库来处理通过AJAX上传的文件,该库实际上是利用变通办法来解决的,因为您实际上无法真正在浏览器中本地异步发布文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句