【问题标题】:How to send raw text with xmlhttp request?如何使用 xmlhttprequest 发送原始文本?
【发布时间】:2013-04-06 06:35:13
【问题描述】:

我正在尝试使用 ajax 将 textarea 字段的文本发送到 PHP 文件,该文本包含 HTML 字符并且不应被编码。
使用FormData 可以完美运行,但是 ie 9 和更早的版本不支持它!我试图通过将requestHeader 设置为text/plain;charset=UTF-8;multipart/form-datastring 发送数据,但它不起作用! 我使用的代码是:

var string = '<td clas="tdClass">some text<?php echo $contents; ?></td>';

var data = new FormData();
data.append("data" , string);
var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new activeXObject("Microsoft.XMLHTTP");
xhr.open( 'post', '/path/to/php', true );
xhr.send(data);

在 IE 9 中执行此操作的另一种方法是什么?

【问题讨论】:

  • 我喜欢您不检查 FormData 而是检查 XMLHttpRequest 的方式,还有什么是 html 字符?你的意思是html标签?你想避免什么样的编码?
  • 文本包含&lt; &gt; ' " &amp; ? . 等字符,我需要按原样发送文本!
  • 必须对值进行编码,以防它包含表单字段分隔符。但是用于检索服务器代码中的表单字段的 API 应该对其进行解码并返回原始字符串。如果您不使用 API,则必须自己进行。
  • 不能通过设置headerRequestcontent-type/content-description/content-transfer-encoding/boundary来实现吗?我正在阅读一些与此相关的文章,但它非常复杂和令人困惑,我不知道该怎么做或者它是否会起作用!

标签: javascript ajax xmlhttprequest


【解决方案1】:

是的,可以通过像这样修改headerRequestdata 来完成:

var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new activeXObject("Microsoft.XMLHTTP");

if(typeof(FormData) == 'undefined'){
    var boundary = '---------------------------' + (new Date).getTime(),//boundary is used to specify the encapsulation boundary of a parameter
        data = "--" + boundary + "\r\n";
        data += 'Content-Disposition: form-data; name="data"\r\n\r\n';//here we specify the name of the parameter name (data) sent to the server which can be retrieved by $_POST['data']
        data += string + "\r\n";
        data += "--" + boundary + "--\r\n";
    xhr.open( 'post', 'writeCode.php', true );
    xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
}else{
    var data = new FormData();
    data.append("data", string);
    xhr.open( 'post', 'writeCode.php', true );
}
xhr.send(data);

【讨论】:

  • 哇,这正是我想要的,它适用于所有浏览器,甚至 IE 7 :),非常感谢
  • 在这里使用 multipart/form-data 是完全不必要的,而且过于复杂。使用常规 POST(即 application/x-www-form-urlencoded)可以更轻松地实现相同的效果。 OP 真正想要的只是将他的字符串原封不动地传递给 PHP。
【解决方案2】:

如果使用FormData 对您来说可以正常工作,那么在您无法使用它的情况下,实际上您需要做的就是将最后一行替换为:

xhr.send("data="+encodeURIComponent(string));

我认为其他回答者对您要求文本“未编码”感到困惑。表单数据通常经过编码以通过 HTTP 发送,然后在到达服务器时由 PHP解码完全透明:您得到 完全是原始文本 /em>,不管它可能包含什么特殊字符。 (假设您将 PHP 字符串解释为 UTF-8)。

因此,按照您的示例,如果您的 PHP 文件包含:

$data = $_POST['data'];

那么 PHP $data 变量的内容将是字符串 '&lt;td clas="tdClass"&gt;some text&lt;?php echo $contents; ?&gt;&lt;/td&gt;'。这与您使用 FormData 方法相同。

【讨论】:

    【解决方案3】:

    因为,好吧,毕竟它看起来很简单。这里还有一些示例。

    只发布随机文本

    // just text
    var dest = "http://requestb.in/qwb9y3qw";
    
    var xhr = new XMLHttpRequest();
    xhr.open("POST", dest, true);
    
    var myText = "foobar";
    xhr.send(myText);

    发布一个 JSON 对象

    // post json
    var dest = "http://requestb.in/1908jrv1";
    
    var xhr = new XMLHttpRequest();
    xhr.open("POST", dest, true);
    
    var myObject = {};
    myObject.prop1 = "foo";
    myObject.prop2 = "bar";
    xhr.send(JSON.stringify(myObject));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多