当前位置: 首页 > 面试题库 >

如何在jQuery中发送带有Ajax请求的FormData对象?

楚和悌
2023-03-14
问题内容

XMLHttpRequest的2级标准(还是一个工作草案)定义FormData的接口。该接口允许将File对象附加到XHR请求(Ajax请求)。

顺便说一句,这是一个新功能-过去曾使用过“ hidden-iframe-trick”(请在我的另一个问题中阅读)。

它是这样工作的(示例):

var xhr = new XMLHttpRequest(),
    fd = new FormData();

fd.append( 'file', input.files[0] );
xhr.open( 'POST', 'http://example.com/script.php', true );
xhr.onreadystatechange = handler;
xhr.send( fd );

哪里input<input type="file">字段,并且handler是Ajax请求的成功处理者。

在所有浏览器中(同样,除IE之外),它都能很好地工作。

现在,我想使此功能与jQuery一起使用。我尝试了这个:

var fd = new FormData();    
fd.append( 'file', input.files[0] );

$.post( 'http://example.com/script.php', fd, handler );

不幸的是,这是行不通的(抛出“非法调用”错误- 屏幕截图在此处)。我假设jQuery需要一个表示表单字段名称/值的简单键值对象,并且FormData我要传递的实例显然不兼容。

现在,由于可以将FormData实例传递到中xhr.send(),我希望也可以使其与jQuery一起使用。

建议我使用“ Ajax预过滤器” …

HTML:

<form>
    <input type="file" id="file" name="file">
    <input type="submit">
</form>

JavaScript:

$( 'form' ).submit(function ( e ) {
    var data, xhr;

    data = new FormData();
    data.append( 'file', $( '#file' )[0].files[0] );

    xhr = new XMLHttpRequest();

    xhr.open( 'POST', 'http://hacheck.tel.fer.hr/xml.pl', true );
    xhr.onreadystatechange = function ( response ) {};
    xhr.send( data );

    e.preventDefault();
});

上面的代码导致此HTTP请求:

多部分数据

这就是我需要的 -我想要“多部分/表单数据”内容类型!

提议的解决方案如下所示:

$( 'form' ).submit(function ( e ) {
    var data;

    data = new FormData();
    data.append( 'file', $( '#file' )[0].files[0] );

    $.ajax({
        url: 'http://hacheck.tel.fer.hr/xml.pl',
        data: data,
        processData: false,
        type: 'POST',
        success: function ( data ) {
            alert( data );
        }
    });

    e.preventDefault();
});

但是,这导致:

如您所见,内容类型是错误的…


问题答案:

我相信您可以这样做:

var fd = new FormData();    
fd.append( 'file', input.files[0] );

$.ajax({
  url: 'http://example.com/script.php',
  data: fd,
  processData: false,
  contentType: false,
  type: 'POST',
  success: function(data){
    alert(data);
  }
});

笔记:

设置processDatafalse可以防止jQuery自动将数据转换为查询字符串。有关更多信息,请参阅文档。

设置contentType to false为当务之急,因为否则jQuery 会错误地设置它。



 类似资料:
  • 问题内容: 如何在python中发送带有请求的请求?我了解如何发送文件,但是通过这种方法如何发送表单数据尚不清楚。 问题答案: 基本上,如果你指定参数(字典),则将发送m而不是。你不限于在该词典中使用实际文件,但是: 可以让你知道你发布了哪些标题;在我们有: 更好的是,你可以通过使用元组而不是单个字符串或字节对象来进一步控制每个部分的文件名,内容类型和其他标题。该元组应该包含2到4个元素;文件名,

  • 交互过程中,发送请求是第一步。那么,我们将如何构造一个请求呢? 这一章节,我们将一步一步来构建一个 Ajax 请求。学习本节,你将学会: 如何通过 XMLHttpRequest 和 ActiveXObject 来构造一个通用的 xhr 对象。 如何通过 xhr 对象来发送 GET、 POST 等请求。 Content-type 在 Ajax 数据发送中的作用。 那么,接下来让我们进入本节的学习吧。

  • 问题内容: 我正在发送一个带有2个post值的ajax请求,第一个是“ action”,它定义了我的php脚本必须解析的动作,另一个是“ id”,它是要为其解析脚本的用户的ID。 服务器在array()中返回6个值,然后使用PHP函数将其编码为JSON: 我的一些响应为HTML,但是当我将其编码为JSON时,它会转义,因此 如何禁用它? 当我不知道如何在获得服务器响应时在jQuery中显示此消息时

  • 我正在制作一个文本游戏,需要将一个对象(地点)上传到Java web服务器。(玩家需要共享数据,但这里不关心安全性)我正在使用java。网http API。我目前的方法是 但这会抛出。我真的不知道该怎么解决这个问题,所有的教程和StackOverflow问题要么使用大量的第三方API,要么使用过时的代码(java 9之前的版本),要么想要发送字符串或int之类的东西。这些都是无益的。我不太确定这段

  • 问题内容: 问题 因此,一段时间以来,我一直在尝试使用不同的AJAX方法将数据发送到将要处理并存储在MySQL数据库中的服务器。 AJAX请求命中的页面使用PHP的PDO准备好的语句来保存数据,因此MySQL注入并不是真正的问题,还需要处理密码或需要加密的数据,这不是我要的这里。我的问题更多地涉及从客户端传输到服务器时如何确保数据的安全性。 方法 我目前有(对于下面包含的登录示例): 域上运行的S

  • 我试图在ajax调用中发布json请求,但我没有收到来自请求的任何成功响应。 请找到我下面的代码:我在这里做错了什么: 它击中了网址,我得到200确定状态,但它总是出错条件... 有人能帮忙吗,我需要改变什么工作: 我尝试了data:JSON. stringify({key:"value", key1:"value e1"})-但这也没有帮助