使用javascript将xml作为二进制文件发布

使用javascript将xml作为二进制文件发布,javascript,xml,ajax,yui,Javascript,Xml,Ajax,Yui,我正在尝试编写一些可以将xml作为二进制文件发布到JavaScript中的外部URL(我无法控制)的东西。 我有YUI3。如果我需要的话,可能还有jQuery 有什么想法吗?我所看到的一切似乎都是关于接收xml,而不是发布它 编辑:外部url是一个广告机器人,xml基本上描述了我想要返回的广告类型 我被迫以二进制方式发布。我已经测试过使用- <form enctype="multipart/form-data" action="http://something.com" method="p

我正在尝试编写一些可以将xml作为二进制文件发布到JavaScript中的外部URL(我无法控制)的东西。 我有YUI3。如果我需要的话,可能还有jQuery

有什么想法吗?我所看到的一切似乎都是关于接收xml,而不是发布它

编辑:外部url是一个广告机器人,xml基本上描述了我想要返回的广告类型

我被迫以二进制方式发布。我已经测试过使用-

<form enctype="multipart/form-data" action="http://something.com" method="post">
<input name="anything" type="file">something</file>
<input type="submit">
</form>
});
`

我想我理解你的要求,但如果我完全走错了方向,下面的内容可能会显得有点傲慢,所以请提前道歉

如果您只想通过AJAX将一个XML文件发送到一个已知的URL,那么它在javascript中相当简单,没有像jQuery等可爱的东西。我假设您已经生成了XML文件,并将其作为字符串变量存储在某处

下面的代码有点凌乱,相当基本,但希望它能为您指明正确的方向。如果搜索AJAX对象,可能有更好的方法获取它们,但这是我多年来一直使用的方法,从来没有遇到过任何问题

您需要编写一些代码来解析服务器响应,以确定数据是否被接受-请参阅代码中的注释以了解您将在何处执行此操作。这里的
ajaxObj.status
ajaxObj.responseText
属性将是您的朋友

function postXMLToServer (serverURL, xmlStr) {

  // Declare some variables
  var activeXModes, i, ajaxObj, aSync, contentType;

  // Set this to false to perform the request synchronously (i.e. execution will block until request has completed)
  aSync = true;

  // 'application/octet-stream' is treated as raw binary data by any sensible server.
  // It might make more sense to use 'text/xml' or some variant depending on your application
  contentType = 'application/octet-stream';

  // Fetch an AJAX object
  activeXModes = ["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
  if (window.ActiveXObject) { // Try ActiveX (for IE)
    for (i = 0; i < activeXModes.length; i++) {
      try {
        ajaxObj = new ActiveXObject(activeXModes[i]);
      } catch (e) {}
    }
  } else if (window.XMLHttpRequest) { // For Mozilla, Safari etc
    ajaxObj = new XMLHttpRequest();
  } else { // No AJAX
    alert('AJAX is not supported in your browser');
    return;
  }

  // Open connection to server
  ajaxObj.open('POST',serverURL,aSync);

  // Set some request headers - you might be able to get away with not doing this, but it
  // should be considered good practice, especially when doing POST requests
  ajaxObj.setRequestHeader('Content-Type',contentType);
  ajaxObj.setRequestHeader('Content-Length',xmlStr.length);

  // Set a callback for asynchronous requests (not called if aSync = false)
  ajaxObj.onreadystatechange = function () {
    if (ajaxObj.readyState == 4) {

      // parse the server response here

    }
  };

  // Send the request
  ajaxObj.send(xmlStr);

  // if aSync = false, parse the server response here

}

// Example of how to use the function
var myXMLStr = '<?xml version="1.0" encoding="iso-8859-1" ?>\n<toplevel>\n<lowerlevel anattribute="a value">An inner value</lowerlevel>\n</toplevel>';
var myURL = 'http://sub.domain.tld/path/to/document.ext?getparameter=somevalue';

postXMLToServer(myURL,myXMLStr);
函数postXMLToServer(serverURL,xmlStr){
//声明一些变量
var-activeXModes,i,ajaxObj,aSync,contentType;
//将此设置为false以同步执行请求(即,执行将阻止,直到请求完成)
异步=真;
//“应用程序/八位字节流”被任何合理的服务器视为原始二进制数据。
//根据应用程序的不同,使用“text/xml”或其他变体可能更有意义
contentType='应用程序/八位字节流';
//获取AJAX对象
activeXModes=[“Msxml2.XMLHTTP”,“Microsoft.XMLHTTP”];
如果(window.ActiveXObject){//尝试ActiveX(用于IE)
对于(i=0;i
你想要什么还不完全清楚计算机中的所有内容都用二进制表示。因此,当您将XML文档发布到
http://something.com
,它是正在传输的XML文件中字符的二进制表示形式。

在我看来,您正在尝试XSS,如果不是。。。如果您对XML没有任何控制权,您如何确定“外部URL”将发布XML?将XML发布为二进制的目的是什么?即使目标计算机没有相同的文件,您是否仍在尝试保留文件的结尾?为什么不像在普通的HTTP帖子中那样将XML作为XML发布呢?我已经编辑了这个问题,希望这能澄清你的两个评论。编辑之后,它会变得更清晰。而且它为什么不工作也变得很清楚:输入
file
类型从本地磁盘获取一个文件。它的安全性使您无法通过JavaScript发送此文件,否则任何页面都可以在没有用户干预的情况下通过internet从您的计算机发送任何文件。谢谢,但问题是如何以二进制格式发布xml,而不是我无法进行ajax调用。阅读您的编辑,您需要做的是将上面的contentType变量设置为
multipart/formdata;boundary=“--这是BoundaryStringThat willnever appearinMyContent”
并将您的XML包装成一个。非常好,谢谢。这篇评论让我读到了这篇文章——这正是我想要的。DaveRandom,首先测试
XMLHttpRequest
分支可能会更高效,因为大多数浏览器,包括8版以上的IE,都支持它。虽然一切本质上都是二进制的,XML和其他基于文本的格式通常在传输时进行转换。从大端到小端,或从CRLF行结束到LF或CR行结束。但是,当使用HTTP POST请求发送时,如果使用浏览器完成,通常不会发生这种转换,并且您收到的内容与您发送的内容相同(但在网络上,这是一种不同的表示)。
function postXMLToServer (serverURL, xmlStr) {

  // Declare some variables
  var activeXModes, i, ajaxObj, aSync, contentType;

  // Set this to false to perform the request synchronously (i.e. execution will block until request has completed)
  aSync = true;

  // 'application/octet-stream' is treated as raw binary data by any sensible server.
  // It might make more sense to use 'text/xml' or some variant depending on your application
  contentType = 'application/octet-stream';

  // Fetch an AJAX object
  activeXModes = ["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
  if (window.ActiveXObject) { // Try ActiveX (for IE)
    for (i = 0; i < activeXModes.length; i++) {
      try {
        ajaxObj = new ActiveXObject(activeXModes[i]);
      } catch (e) {}
    }
  } else if (window.XMLHttpRequest) { // For Mozilla, Safari etc
    ajaxObj = new XMLHttpRequest();
  } else { // No AJAX
    alert('AJAX is not supported in your browser');
    return;
  }

  // Open connection to server
  ajaxObj.open('POST',serverURL,aSync);

  // Set some request headers - you might be able to get away with not doing this, but it
  // should be considered good practice, especially when doing POST requests
  ajaxObj.setRequestHeader('Content-Type',contentType);
  ajaxObj.setRequestHeader('Content-Length',xmlStr.length);

  // Set a callback for asynchronous requests (not called if aSync = false)
  ajaxObj.onreadystatechange = function () {
    if (ajaxObj.readyState == 4) {

      // parse the server response here

    }
  };

  // Send the request
  ajaxObj.send(xmlStr);

  // if aSync = false, parse the server response here

}

// Example of how to use the function
var myXMLStr = '<?xml version="1.0" encoding="iso-8859-1" ?>\n<toplevel>\n<lowerlevel anattribute="a value">An inner value</lowerlevel>\n</toplevel>';
var myURL = 'http://sub.domain.tld/path/to/document.ext?getparameter=somevalue';

postXMLToServer(myURL,myXMLStr);