Xul Firefox插件,单击按钮下载文件并将其发布到另一台服务器

Xul Firefox插件,单击按钮下载文件并将其发布到另一台服务器,xul,nsfilemanager,Xul,Nsfilemanager,我可以访问一个网站,该网站有一个简单的按钮(我没有自己的网站,也没有访问源代码)来下载文档。我正在使用下面的代码来执行它,它似乎工作正常,但有问题 目标 我想下载这个文件 将文件数据发布到其他站点 问题 有时下载的文档很大,或者单击按钮后没有文档 在同一操作系统的不同机器上,同一版本的FF不起作用 下面的代码 Components.utils.import("resource://gre/modules/Downloads.jsm"); Components.utils.im

我可以访问一个网站,该网站有一个简单的按钮(我没有自己的网站,也没有访问源代码)来下载文档。我正在使用下面的代码来执行它,它似乎工作正常,但有问题

目标

  • 我想下载这个文件

  • 将文件数据发布到其他站点

问题

  • 有时下载的文档很大,或者单击按钮后没有文档
    • 在同一操作系统的不同机器上,同一版本的FF不起作用
下面的代码

  Components.utils.import("resource://gre/modules/Downloads.jsm");
  Components.utils.import("resource://gre/modules/Task.jsm");

  window.content.location.href = "javascript:void download_document()";

  Task.spawn(function () {
    let list = yield Downloads.getList(Downloads.ALL);
    let downloads = yield list.getAll();
    setTimeout(function(d_before){
        Task.spawn(function(d_before) {
          let list = yield Downloads.getList(Downloads.ALL);
          let downloads = yield list.getAll();
          var file =  downloads[downloads.length-1];
          var parts = file.target.path.split('/');
          var document_name = parts[parts.length-1];

          // alert(document_name);
          var file = FileUtils.getFile("DfltDwnld", [document_name]);
          Components.utils.import("resource://gre/modules/NetUtil.jsm");
          NetUtil.asyncFetch(file, function(inputStream, status) {

            // alert("Fetching file");
            if (!Components.isSuccessCode(status)) {
              return;
            }
            var data =  NetUtil.readInputStreamToString(inputStream, inputStream.available());

            // alert("Reading file data");
            data = window.btoa(data);

            // alert("File data read");
            // alert(prefs.getCharPref("server_ip"));
            xmlhttp.open("POST",ht_server+"/import_document",true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send("authentication_token="+prefs.getCharPref("api_key")
                +"&email="+prefs.getCharPref("email")
                +"&body="+encodeURIComponent(content.document.body.innerHTML)
                +"&document_name="+document_name
                +"&document_data="+encodeURIComponent(data));
            // alert("Finished");
          });
        }).then(null, Components.utils.reportError);
    },3000);
  }).then(null, Components.utils.reportError);
对于我的解决方案,上面的代码并不完整,但我主要关心的是它在某些机器上工作,而在其他机器上,我会收到此错误(当下载文档时)

我不是这方面的专家,我还没能解决这个问题


有人能给我一些建议吗?

我建议检查selenium,这是一款基于java的web应用程序,有助于测试web应用程序。它允许更多的自动化,并且可以以混合方式使用,您可以只保留在临时文件夹中查找文件的代码部分,然后将文件发布/上传到其他地方

firefox插件还允许在FF IDE中进行更多控制

  function download_and_post(){

      //simple version

      //button click or whatever that starts the download
      window.content.location.href = "javascript:void download_document()";



      var dJsm = Components.utils.import("resource://gre/modules/Downloads.jsm").Downloads;
      var tJsm = Components.utils.import("resource://gre/modules/Task.jsm").Task;
      var fuJsm = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils;
      var nsiPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);


        var view = {
           onDownloadChanged: function (download) {
              if (download.succeeded) {
               var file = fuJsm.File(download.target.path);
               NetUtil.asyncFetch(file, function(inputStream, status) {
                 if (!Components.isSuccessCode(status)) {
                  return;
                 }
                  var data =  NetUtil.readInputStreamToString(inputStream, inputStream.available());
                  btoa_data = window.btoa(data);

                  var xmlhttp = new XMLHttpRequest(); 
                  xmlhttp.open("POST","http://someserver.com",true);
                  xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                  xmlhttp.send(
                      "file_data="+encodeURIComponent(btoa_data)
                      +"&file_name="+ get_file_for_os(download.target.path)
                  );
              });
                tJsm.spawn(function () {
                   let list = yield dJsm.getList(Downloads.ALL);
                   list.removeView(view);
                }).then(null, Components.utils.reportError); 
              }
           }
        };

        tJsm.spawn(function () {
           let list = yield dJsm.getList(Downloads.ALL);
           list.addView(view);
        }).then(null, Components.utils.reportError);
  }


  function get_file_for_os(file){
      var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS; 
      if (osString == "Linux"){
          var document_name_no_path = file.split('/').pop();
      }else{
          var document_name_no_path= file.split("\\").pop();
      }
      return document_name_no_path;
  }
这适用于所有平台,并发送文档名称和数据;-)

上面的链接会有所帮助
  function download_and_post(){

      //simple version

      //button click or whatever that starts the download
      window.content.location.href = "javascript:void download_document()";



      var dJsm = Components.utils.import("resource://gre/modules/Downloads.jsm").Downloads;
      var tJsm = Components.utils.import("resource://gre/modules/Task.jsm").Task;
      var fuJsm = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils;
      var nsiPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);


        var view = {
           onDownloadChanged: function (download) {
              if (download.succeeded) {
               var file = fuJsm.File(download.target.path);
               NetUtil.asyncFetch(file, function(inputStream, status) {
                 if (!Components.isSuccessCode(status)) {
                  return;
                 }
                  var data =  NetUtil.readInputStreamToString(inputStream, inputStream.available());
                  btoa_data = window.btoa(data);

                  var xmlhttp = new XMLHttpRequest(); 
                  xmlhttp.open("POST","http://someserver.com",true);
                  xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                  xmlhttp.send(
                      "file_data="+encodeURIComponent(btoa_data)
                      +"&file_name="+ get_file_for_os(download.target.path)
                  );
              });
                tJsm.spawn(function () {
                   let list = yield dJsm.getList(Downloads.ALL);
                   list.removeView(view);
                }).then(null, Components.utils.reportError); 
              }
           }
        };

        tJsm.spawn(function () {
           let list = yield dJsm.getList(Downloads.ALL);
           list.addView(view);
        }).then(null, Components.utils.reportError);
  }


  function get_file_for_os(file){
      var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS; 
      if (osString == "Linux"){
          var document_name_no_path = file.split('/').pop();
      }else{
          var document_name_no_path= file.split("\\").pop();
      }
      return document_name_no_path;
  }