разместить XML как бинарный файл, используя JavaScript - PullRequest
0 голосов
/ 12 августа 2011

Я пытаюсь написать что-то, что может публиковать xml, в виде двоичного файла на внешний URL (который я не могу контролировать) в JavaScript. У меня есть 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>

и это работает. Мне просто нужно реализовать в JS. Редактировать # 2

Мое решение (не удалось правильно отформатировать его) -

var AdManager = { getRandomBoundary : function(){ var today = new Date; return '---' + today.getTime(); }, fetch : function(){ var boundary = this.getRandomBoundary(); var xhr = new XMLHttpRequest; var CRLF = "\r\n";

    xhr.open('POST', 'http://url.com', true);
    xhr.onreadystatechange = function(){
        if (xhr.readyState === 4)
        {
            //Parse xml(badly)
            var splitter = xhr.responseText.split('<responsecontent>');
            var allAds = '';
            for (var i= 1; i< splitter.length; i++)
            {
                var tempAd = splitter[i].split('</responsecontent>');
                allAds += tempAd[0];
            }
            //Html is returned encoded, so decode.
            jQuery('#results').html(jQuery("<div/>").html(allAds).text());
        }
    };

    xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

    var mimeReq = "--" + boundary + CRLF;
    mimeReq += 'Content-Disposition: form-data; name="arbitrary"; filename="arbitrary.xml"' + CRLF;
    mimeReq += 'Content-Type: application/octet-stream' + CRLF + CRLF;
    mimeReq += '<?xml version=\"1.0\" encoding=\"utf-8\"?><adrequestpacket responsemarkup=\"wml\" test=\"0\" xmlns=...'+ CRLF;
    mimeReq += "--" + boundary + "--" + CRLF;

    xhr.send(mimeReq);
}

}; `

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Мне кажется, я понимаю, о чем вы спрашиваете, но если я полностью на неправильном пути, ниже может показаться немного покровительственным, поэтому заранее извиняюсь ...

Если все, что вы хотите сделать, этоотправьте XML-файл по известному URL через AJAX, это довольно просто в 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);
0 голосов
/ 12 августа 2011

Не совсем понятно, чего вы хотите. Все в компьютере представлено в двоичном виде.Поэтому, когда вы публикуете XML-документ в http://something.com, передается двоичное представление символов в XML-файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...