使用javascript将xml作为二进制文件发布
我正在尝试编写一些可以将xml作为二进制文件发布到JavaScript中的外部URL(我无法控制)的东西。 我有YUI3。如果我需要的话,可能还有jQuery 有什么想法吗?我所看到的一切似乎都是关于接收xml,而不是发布它 编辑:外部url是一个广告机器人,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
<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);