Http Upload Sample

Photoshop Script Snippets - Note: Full Scripts go in the Photoshop Scripts Forum

Moderators: Tom, Kukurykus

xbytor

Http Upload Sample

Post by xbytor »

This is a follow up from and Adobe Ps JS forum post.

Code: Select all// Copyright 2008. Studio Melipone. All rights reserved.
// Licence GNU LGPL
// Send the active document to the UpShot web service (http://upshotit.com)
// The document is sent as a .png file, as a draft on the user's account.
// Therefore you must have a document opened and Adobe Bridge installed to perform this script.

/*
   <javascriptresource>
      <name>UpShot</name>
      <type>automate</type>
      <about>
      Script for Upshot
      Copyright 2008 Studio Melipone
       <http://upshotit.com>
      </about>
      <enableinfo>true</enableinfo>
   </javascriptresource>   
*/

//#target photoshop
#include "Base64.jsx"


//  getSource
//   In CS2, the function 'toSource()' is broken for functions. The return
//   value includes the text of the function plus whatever else is left
//   in the file.
//   This function gets around the problem if you follow some conventions.
//   First, the function definition _must_NOT_ end with a ';'.
//   Second, the next line must contain '// EOF'
//   The result string can then be passed on to Bridge as needed.
//   ftn is the (variable) name of the function
//
function getFunctionSource(ftn) {
  if (isCS2()) {
    var str = ftn.toSource();
    var len = str.indexOf("// EOF");
    return str.substring(0, len) + ')';
  }

  return ftn.toSource();
};

function bridgeUpload(file, login, pass, buffer) {

  function _bridgeUpload(file, login, pass, buffer) {
    if(!ExternalObject.webaccesslib ) {
      ExternalObject.webaccesslib = new ExternalObject('lib:webaccesslib');
    }
    var http = new HttpConnection('http://127.0.0.1:3000/en/users/get_id.xml') ;
    http.response = idfile ;
    http.username = login;
    http.password = pass;
    http.mime='text/xml';
    http.responseencoding='utf8';
    http.execute();
    http.response.close();
    http.close();
    idfile.open("r");
    var str = idfile.read();
    idfile.close();
    var send = new HttpConnection('http://127.0.0.1:3000/en/users/' +
                                  str + '/upshots') ;
    send.method = 'POST';
    send.username = login;
    send.password = pass;
    send.mime='text/xml';
    send.requestheaders=['Host','http://localhost:3000'];
    send.requestheaders=['Accept','*/*'];
    send.requestheaders=['Content-Type','text/xml'];
    send.request = ('<upshot><file_name>' + f.name +' </file_name><size>' +
                   f.length + '</size><javafile>' + buffer +
                   '</javafile></upshot>');
    send.execute();
    /* ??? What is this for ??? The 'return' was missing ??? */
    return idfile.toSource();
  }
  // EOF
  // The EOF must occur immediately after the function and the function
  // must not be terminated by a ;

  if (BridgeTalk.appName == "bridge") {
    _bridgeUpload(file, idfile, login, pass, buffer);
    return;
  }

  var src = _bridgeUpload.toSource();

  var brCode = ("function _run(file, idfile, login password) {\n" +
                "  var getMetadata = " + src + ";\n\n" +
                "  return getMetadata(files);\n" +
                "};\n" +
                "_run(" +
                file.toSource() + ', ' +
                idfile.toSource() + ', ' +
                login.toSource() + ', ' +
                pass.toSource() +
                ");\n");

  // create a new BridgeTalk message object
  var bt = new BridgeTalk;
  // target the Adobe Bridge application
  bt.target = bridgeTarget;
  //p173 of Javascript Tools Guide for CS3 for http message
  bt.body = brCode;

  bt.onResult = function(result) {
    var object = bt.result = eval(result.body);
    //file.remove();
    //object.remove();
    //bridge.quit ();
    //eval(result.body);
  };

  bt.onError = function( message ) {
    var errCode = parseInt (message.headers ["Error-Code"]);
    throw new Error (errCode, message.body);
  } ;

  //send the message ( also launch the targetted application)
  // 'send' with a timeout arg only works in CS3
  // you need to use sendSync from XBridgeTalk
  bt.send(10);

  return bt.result;
};

//////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/*functions from <bb/viewtopic.php?t=1282> */
//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

function getAppSpecifier(appName) {
  if (isCS2()) {
    if (appName == 'photoshop') {
      return 'photoshop-9.0';
    }
    if (appName == 'bridge') {
      return 'bridge-1.0';
    }
    // add other apps here
  }

  if (isCS3()) {
    if (appName == 'photoshop') {
      return 'photoshop-10.0';
    }
    if (appName == 'bridge') {
      return 'bridge-2.0';
    }
    // add other apps here
  }

  return undefined;
};

function isCS2() {
  var appName = BridgeTalk.appName;
  var version = BridgeTalk.appVersion;

  if (appName == 'photoshop') {
    return version.match(/^9\./) != null;
  }
  if (appName == 'bridge') {
    return version.match(/^1\./) != null;
  }

  return false;
};
function isCS3() {
  var appName = BridgeTalk.appName;
  var version = BridgeTalk.appVersion;

  if (appName == 'photoshop') {
    return version.match(/^10\./) != null;
  }
  if (appName == 'bridge') {
    return version.match(/^2\./) != null;
  }

  return false;
};

function main() {
  app.bringToFront();

  if (BridgeTalk.appName == "bridge") {
    // this is for testing only
    var file = "someFilename";
    var idfile = "somepath/id.xml") ;
    var login = "someLogin";
    var pass = "somePass";
    var f = new File(filepath);
    f.open();
    f.encoding = 'BINARY';
    var str = f.read();
    f.close();

    var buffer = base64encode(str);

    bridgeUpload(file, idfile, login, pass, buffer);

    return;
  }

  if (app.documents.length==0) { // is a document opened ?
    alert("There are no Photoshop documents opened !");
    return;
  }

  /********************************************************/

  // Only Bridge can use HttpConnection, so we test if it is installed
  var bridgeTarget = BridgeTalk.getSpecifier(getAppSpecifier("bridge"));
 
  if( !bridgeTarget ) {
    alert("Adobe Bridge not installed, needed to continue.");
    return;
  }

  app.preferences.rulerUnits = Units.PIXELS;
  app.displayDialogs = DialogModes.NO;

  /*********************************************/
  /* STEP 1 : save current document as image file (temporary) */
  /******************************************/
  var docRef = activeDocument;
  //create the image file in the installation folder of Photoshop
  var filepath=app.path.toString()+"/"+docRef.name+".jpg";
  var file = new File(filepath);
  //var options = new ExportOptionsSaveForWeb();
  //options.format = SaveDocumentType.PNG;
  var options = new JPEGSaveOptions();
  options.quality=8;
  docRef.saveAs (file, options, true, Extension.LOWERCASE);
  //docRef.exportDocument (file, ExportType.SAVEFORWEB , options);
  file.close();


  /**********************************/
  /* STEP 2 : retrieve user's login & password */
  /*******************************/
 
  res = "dialog { text: 'UpShot authentication', \
               info: Panel { orientation: 'column', alignChildren:'right', \
                           text: 'Please Identify Yourself',                   \
                           login: Group { orientation: 'row',                  \
                              s: StaticText { text:'Login :' },                 \
                              e: EditText { characters: 30 }                    \
                           },                                                  \
                           passwd: Group { orientation: 'row',                 \
                              s: StaticText { text:'Password :' },                \
                              e: EditText { characters: 30, properties:{noecho: true} }, \
                           }                                                     \
                     },                                                        \
               buttons: Group { orientation: 'row',                          \
                        okBtn: Button { text:'OK', properties:{name:'ok'} },    \
                        cancelBtn: Button { text:'Cancel', properties:{name:'cancel'} } \
               }                                                             \
            }";

  dlg = new Window (res);
  dlg.center();
  dlg.show();

  var idfile = new File(app.path + "/id.xml") ;
  var login = dlg.info.login.e.text;//retrieve the values given in the form
  var pass = dlg.info.passwd.e.text;

  /******************************/
  /* STEP 3 : send image through Bridge */
  /***************************/

  var f = new File(filepath);
  f.open();
  f.encoding = 'BINARY';
  var buffer = f.read();
  f.close();
  var b64buffer = base64encode(str);

  alert("file size "+file.length);
  alert("f size "+f.length);
  alert("BUF "+ buffer);
  // I thinks this
  //     alert(base64encode("B64 "+base64encode(buffer)));
  // should be this
  alert("B64 "+ b64buffer);

  bridgeUpload(file, idfile, login, pass, b64buffer);

   /**********************************************/
   /* STEP 4: Once all done, delete the image previously created */
   /*******************************************/
};

main();

// EOF

greg

Http Upload Sample

Post by greg »

In fact this script should really work fine.
We found out that the problem was that the encoded Base64 received by the server was not at all the same as the one sent.. but the encoding itself works fine.