【问题标题】:AJAX Post to PHP with JSON Object containing a File使用包含文件的 JSON 对象的 AJAX 发布到 PHP
【发布时间】: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'];

现在我的电子邮件发送正确。

【问题讨论】:

标签: php ajax post file-upload


【解决方案1】:

$_FILES superglobal 只会在为 POST 设置 multipart/form-data content-type 时创建,并且将包含正在 POST 的实际文件,而不是对该文件的本地引用。相反,您发送的是 JSON 请求(希望使用适当的 application/json 内容类型)。这不会填充$_FILES。除非您的接收脚本能够获取提供的路径信息并访问相关文件,否则您的 POST 脚本实际上需要将文件作为 POST 的一部分发送。

通过 AJAX 上传文件最好使用特定的 AJAX 上传库来处理,这些库主要是利用解决方法来解决您确实无法在浏览器中以本机方式异步发布文件的事实。

【讨论】:

  • 谢谢 - 所以与其用我的表单组件创建一个对象,我应该 1. 将我的整个表单提交给 PHP 脚本,以及 2. 将我的 AJAX 帖子中的 contentType 更改为“multipart/form-数据”?
  • 这可能是关于异步文件上传的权威 SO 帖子 - stackoverflow.com/questions/166221/… 阅读前几个答案,了解您正在尝试做什么的非常重要的考虑因素。
  • 这个答案让我走上了正确的道路。请参阅上面的更改以使其正常工作。
【解决方案2】:

你有没有尝试过这样的事情-

将 json 代码复制到变量“a”中,然后对其进行解码,即 json_decode(a),然后 a->文件

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 2012-05-29
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多