2014-02-26 31 views
1

將一個主題從谷歌組移動到這裏,以便它可以幫助某人詢問。上傳圖像二進制 - 使用imageshack api

ImageShack的API:http://api.imageshack.us/

最終HTTP reqeust正在返回JSON:

{"success":true,"process_time":325,"result":{"max_filesize":5242880,"space_limit":52428800,"space_used":0,"space_left":52428800,"passed":0,"failed":0,"total":0,"images":[]}} 

這是不好的,因爲它沒有上傳:(

它應該返回一個圖像對象http://api.imageshack.us/#h.ws82a1l6pp9g 因爲這是imageshack api上的上傳圖片部分所說的

please h ELP :(

我的擴展代碼

var blobUrl; 
var makeBlob = function() { 
     bigcanvas.toBlob(function (blob) { 
       var reader = new window.FileReader(); 
       reader.readAsBinaryString(blob); 
       reader.onloadend = function() { 
         blobBinaryString = reader.result; 
         blobUrl = blobBinaryString; 
         Cu.reportError(blobUrl); 
         uploadBlob(); 
       } 
     }); 
}; 

var uploadedImageUrl; 
var uploadBlob = function() { 
     HTTP('POST', 'https://api.imageshack.us/v1/images', { 
       contentType: 'application/x-www-form-urlencoded', 
       //'album=' + urlencode('Stock History') + '& 
       body: 'auth_token=' + urlencode(auth_token) + '[email protected]=' + blobUrl, 
       onSuccess: function (status, responseXML, responseText, headers, statusText) { 
         Cu.reportError('XMLHttpRequest SUCCESS - imageshack uploadBlob\n' + statusText + '\n' + responseText); 
         eval('var json = ' + responseText); 
         uploadedImageUrl = json.direct_link; 
         submitBamdex(); 
       }, 
       onFailure: function (status, responseXML, responseText, headers, statusText) { 
         Cu.reportError('XMLHttpRequest FAILLLLLLLL - imageshack uploadBlob\n' + statusText + '\n' + responseText); 
       } 
     }); 
}; 


makeBlob(); //callllll the func 

回答

1

該代碼上傳在畫布上繪製到ImageShack的

可以複製粘貼,但必須更新一些事情:

  • 更新用戶名
  • 更新密碼
  • 上傳借鑑帆布ID爲 「bigcanvas」
  • 更新您的API密鑰

...

//this code uploads a drawing on a canvas to imageshack 
var auth_token; 
var loginImageshack = function() { 
    HTTP('POST','https://api.imageshack.us/v1/user/login',{ 
     contentType: 'application/x-www-form-urlencoded', 
     body: 'user=USERNAME_TO_IMAGESHACK_HERE&password=' + urlencode('PASSWORD_TO_USERNAME_FOR_IMAGESHACK_HERE'), 
     onSuccess: function(status, responseXML, responseText, headers, statusText) { 
      Cu.reportError('XMLHttpRequest SUCCESS - imageshack login\n' + statusText + '\n' + responseText); 
      eval('var json = ' + responseText); 
      auth_token = json.result.auth_token; 
      makeImageshackFile(); 
     }, 
     onFailure: function(status, responseXML, responseText, headers, statusText) { 
      Cu.reportError('XMLHttpRequest FAILLLLLLLL - imageshack login\n' + statusText + '\n' + responseText); 
     } 
    }); 
}; 

var uploadedImageUrl; 
var makeImageshackFile = function() { 
    var fd = new window.FormData(); 
    fd.append("api_key", 'A835WS6Bww584g3568efa2z9823uua5ceh0h6325'); //USE YOUR API KEY HERE 
    fd.append("auth_token", auth_token); 
    fd.append('album', 'Stock History'); 
    fd.append('title', 'THE-title-you-want-showing-on-imageshack') 
    fd.append("[email protected]", bigcanvas.mozGetAsFile("foo.png")); //bigcanvas is a canvas with the image drawn on it: var bigcanvas = document.querySelector('#bigcanvas'); 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
     switch (xhr.readyState) { 
       case 4: 
        if (xhr.status==0 || (xhr.status>=200 && xhr.status<300)) { 
         Cu.reportError('XHR SUCCESS - \n' + xhr.responseText); 
         eval('var json = ' + xhr.responseText); 
         //ensure it passed else redo it I didnt program in the redo thing yet 
         //succesful json == {"success":true,"process_time":1274,"result":{"max_filesize":5242880,"space_limit":52428800,"space_used":270802,"space_left":52157998,"passed":1,"failed":0,"total":1,"images":[{"id":1067955963,"server":703,"bucket":2397,"lp_hash":"jj9g5p","filename":"9g5.png","original_filename":"foo.png","direct_link":"imageshack.us\/a\/img703\/2397\/9g5.png","title":"082813 200AM PST","description":null,"tags":[""],"likes":0,"liked":false,"views":0,"comments_count":0,"comments_disabled":false,"filter":0,"filesize":1029,"creation_date":1377681549,"width":760,"height":1110,"public":true,"is_owner":true,"owner":{"username":"bamdex","avatar":{"server":0,"filename":null}},"next_images":[],"prev_images":[{"server":59,"filename":"06mm.png"},{"server":706,"filename":"a1fg.png"}],"related_images":[{"server":59,"filename":"06mm.png"},{"server":41,"filename":"xn9q.png"},{"server":22,"filename":"t20a.png"},{"server":547,"filename":"fipx.png"},{"server":10,"filename":"dg6b.png"},{"se 
         uploadedImageUrl = json.result.images[0].direct_link; 
         Cu.reportError('succesfully uploaded image'); 
        } else { 
         Cu.reportError('XHR FAIL - \n' + xhr.responseText); 
        } 
        break; 
      default: 
       //blah 
     } 
    } 
    xhr.open("POST", "https://api.imageshack.us/v1/images"); 
    xhr.send(fd); 
} 

loginImageshack(); 

代碼重要注意上面

  • 應使用JSON。如果你想提交插件到AMO
  • 解析而不是eval
  • 也應該可能使用窗口Services.appShel.hiddenDOMWindow所以像new window.FormData();將成爲上面的代碼需要new Services.appShel.hiddenDOMWindow.FormData();var formData = Components.classes["@mozilla.org/files/formdata;1"].createInstance(Components.interfaces.nsIDOMFormData);Cu.import('resource://gre/modules/FormData.jsm')

輔助功能改變:

const {classes: Cc, interfaces: Ci, utils: Cu, Components: components} = Components 
Cu.import('resource://gre/modules/Services.jsm'); 

...

function urlencode(str) { 
    return escape(str).replace(/\+/g,'%2B').replace(/%20/g, '+').replace(/\*/g, '%2A').replace(/\//g, '%2F').replace(/@/g, '%40'); 
}; 

...

//http request 
const XMLHttpRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]; 

/** 
* The following keys can be sent: 
* onSuccess (required) a function called when the response is 2xx 
* onFailure    a function called when the response is not 2xx 
* username    The username for basic auth 
* password    The password for basic auth 
* overrideMimeType  The mime type to use for non-XML response mime types 
* timeout    A timeout value in milliseconds for the response 
* onTimeout    A function to call if the request times out. 
* body     A string containing the entity body of the request 
* contentType   The content type of the entity body of the request 
* headers    A hash of optional headers 
*/ 
function HTTP(method,url,options) 
{ 
    var requester = new XMLHttpRequest(); 

    var timeout = null; 
    if (!options.synchronizedRequest) { 

     requester.onreadystatechange = function() { 
     switch (requester.readyState) { 
      case 0: 
       if (options.onUnsent) { 
        options.onUnsent(requester); 
       } 
      break; 
      case 1: 
       if (options.onOpened) { 
        options.onOpened(requester); 
       } 
      break; 
      case 2: 
       if (options.onHeaders) { 
        options.onHeaders(requester); 
       } 
      break; 
      case 3: 
       if (options.onLoading) { 
        options.onLoading(requester); 
       } 
      break; 
      case 4: 
       if (timeout) { 
        clearTimeout(timeout); 
       } 
       if (requester.status==0 || (requester.status>=200 && requester.status<300)) { 
        options.onSuccess(
        requester.status, 
        requester.responseXML, 
        requester.responseText, 
        options.returnHeaders ? _HTTP_parseHeaders(requester.getAllResponseHeaders()) : null, 
        requester.statusText 
       ); 
       } else { 
        if (options.onFailure) { 
        options.onFailure(
         requester.status, 
         requester.responseXML, 
         requester.responseText, 
         options.returnHeaders ? _HTTP_parseHeaders(requester.getAllResponseHeaders()) : null, 
         requester.statusText 
        ); 
        } 
       } 
      break; 
     } 
     } 
    } 

    if (options.overrideMimeType) { 
     requester.overrideMimeType(options.overrideMimeType); 
    } 
    if (options.username) { 
     requester.open(method,url,!options.synchronizedRequest,options.username,options.password); 
    } else { 
     requester.open(method,url,!options.synchronizedRequest); 
    } 
    if (options.timeout && !options.synchronizedRequest) { 
     timeout = setTimeout(
      function() { 
      var callback = options.onTimeout ? options.onTimeout : options.onFailure; 
      callback(0,"Operation timeout."); 
      }, 
      options.timeout 
    ); 
    } 
    if (options.headers) { 
     for (var name in options.headers) { 
     requester.setRequestHeader(name,options.headers[name]); 
     } 
    } 
    if (options.sendAsBinary) { 
     Cu.reportError('sending as binary'); 
     requester.sendAsBinary(options.body); 
    } else if (options.body) { 
     requester.setRequestHeader("Content-Type",options.contentType); 
     requester.send(options.body); 
    } else { 
     requester.send(null); 
    } 
    if (options.synchronizedRequest) { 
     if (requester.status==0 || (requester.status>=200 && requester.status<300)) { 
     options.onSuccess(
      requester.status, 
      requester.responseXML, 
      requester.responseText, 
      options.returnHeaders ? _HTTP_parseHeaders(requester.getAllResponseHeaders()) : null, 
      requester.statusText 
     ); 
     } else { 
     if (options.onFailure) { 
      options.onFailure(
       requester.status, 
       requester.responseXML, 
       requester.responseText, 
       options.returnHeaders ? _HTTP_parseHeaders(requester.getAllResponseHeaders()) : null, 
       requester.statusText 
      ); 
     } 
     } 
     return { 
     abort: function() { 
     } 
     }; 
    } else { 
     return { 
     abort: function() { 
      clearTimeout(timeout); 
      requester.abort(); 
     } 
     }; 
    } 
} 
function _HTTP_parseHeaders(headerText) 
{ 
    var headers = {}; 
    if (headerText) { 
     var eol = headerText.indexOf("\n"); 
     while (eol>=0) { 
     var line = headerText.substring(0,eol); 
     headerText = headerText.substring(eol+1); 
     while (headerText.length>0 && !headerText.match(_HTTP_HEADER_NAME)) { 
      eol = headerText.indexOf("\n"); 
      var nextLine = eol<0 ? headerText : headerText.substring(0,eol); 
      line = line+' '+nextLine; 
      headerText = eol<0 ? "" : headerText.substring(eol+1); 
     } 
     // Parse the name value pair 
     var colon = line.indexOf(':'); 
     var name = line.substring(0,colon); 
     var value = line.substring(colon+1); 
     headers[name] = value; 
     eol = headerText.indexOf("\n"); 
     } 
     if (headerText.length>0) { 
     var colon = headerText.indexOf(':'); 
     var name = headerText.substring(0,colon); 
     var value = headerText.substring(colon+1); 
     headers[name] = value; 
     } 
    } 
    return headers; 
} 
+0

在輔助函數中,onTimeout功能不適用於privelaged範圍,我需要使它現在使用nsITimer它現在試圖執行window.setTimeout – Noitidart