【问题标题】:Sending a FormData object to server with Ajax (contains files)使用 Ajax 将 FormData 对象发送到服务器(包含文件)
【发布时间】:2015-10-06 04:58:16
【问题描述】:

我有一个包含文本和文件字段的表单。我正在尝试将整个内容提交到服务器上托管的 php 脚本,并返回一条验证消息。我的表单如下所示:

    <form id="ambassador" method="post" enctype="multipart/form-data">
        <label for="name">Name: </label>
        <input type="text" id="name"> <br />
        <label for="age">Age: </label>
        <input type="number" id="age"> <br />
        <label for="igram">Instagram Account: </label>
        <input type="text" id="igram"> <br />
        <label for="photo">Photograph Upload: </label>
        <input type="file" id="photo"><br />
        <label for="why">Why should you represent Drip Cold Pressed Juice?</label>
        <textarea id="why" width="300px"></textarea>
        <button type="submit" class="btn">Apply!</button>
    </form>

我的 jQuery 看起来像:

jQuery("#ambassador").submit(function(event) {
    event.preventDefault
    var server = "http://getdripped.com/dev/ambassador.php";

    var form = document.getElementById('#ambassador');
    var formData = new FormData(form);

    alert(formData);


    jQuery.ajax({
        url: server,
        type: 'POST',
        data: formData,
        async: false,
        success: function (data) {
            alert(data)
        },
        cache: false,
        contentType: false,
        processData: false
    });

    return false;  
});

php 只包含一个print_r 语句用于$_FILES 数组和另一个$_POST 数组。但是,两个返回的数组都是空的。

【问题讨论】:

  • 嗨,为此你最好使用 iframe
  • @ArtisiticPhoenix — 为什么?
  • 嗨尼克,将异步设置为真。否则,您的浏览器可能会阻塞,直到上传完成。
  • @Quentin - 因为它是老派,它适用于所有浏览器,即使禁用了 javascript。

标签: php jquery ajax multipartform-data


【解决方案1】:

你有两个问题。

未能将表单传递给 FormData 对象

document.getElementById('#ambassador');

getElementById 方法需要一个 id,但您传递给它的是一个 selector。您需要删除#。目前您正在将null 传递给new FormData(因为没有匹配的元素,所以gEBId 返回null)。

表格中没有成功的数据

<input type="number" id="age">

只有当表单控件具有name 属性而您的没有属性时,它们才能成功。

更正 ID 后,您将使用表单中的所有成功控件填充表单数据对象:但没有。

您需要为每个输入添加名称属性。

【讨论】:

  • 你是一个美丽的人!我应该已经发现了这些错误,我想盯着相同的代码真的会烧伤你的大脑!谢谢!
【解决方案2】:

我会使用 iframe 作为表单的目标。

   <form id="ambassador" method="post" enctype="multipart/form-data" target="form_iframe" >

    <iframe name="form_iframe" id="form_iframe" ></iframe>

另见How to make Asynchronous(AJAX) File Upload using iframe?

【讨论】:

  • 感谢您的快速回复!你能详细说明一下吗?我不太熟悉在这种方法中使用 iFrame。
  • 您刚刚设置为表单的目标,并且您可以隐藏 iframe 或显示它,因为处理表单的脚本的任何输出都将显示在 iframe 中,将 iframe 想象成另一个页面或类似我做一个虫洞,就像科幻一样
【解决方案3】:

忽略反对票,并且

将异步设置为 true!

您将异步设置为 false。这意味着您的成功回调不会等待回复并在 PHP 回复之前完成。


如果遇到更多麻烦,请查看this SO Question,因为已经有答案了。

来自jQuery Documentation

请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。

Quentin 关于序列化的说法是对的,我在进一步阅读后删除了序列化选项。

【讨论】:

  • 使用 callback 的全部意义在于它在响应到达之前不会被调用,更重要的是,将 async 设置为 false 会导致脚本阻塞所有内容,直到收到回复。使用serialize 不会包含文件,这使得它毫无意义。
  • @Quentin 如果您投了反对票,请先阅读好我写的“将其设置为 true”。甚至是粗体字。我希望先发表评论。
  • 将其设置为 true,虽然是最佳实践,但根本无助于解决问题。您对为什么应将其设置为 true 的解释仍然完全倒退。
  • @Quentin:取决于他如何检查响应。如果他等待响应,则可能不会出现警报,因为整个函数已经完成并且回调将不再触发。让我们一点一点地到达那里。
  • 代码在问题中!我们可以看到他如何检查响应。他在success 上使用回调,当响应返回时会触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2015-08-04
相关资源
最近更新 更多