Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.Flickr.uploadPhoto
on uploadPhoto (f, title=nil, description=nil, tags=nil, flpublic=nil, flfriend=nil, flfamily=nil, safetyLevel=nil, contentType=nil, flhidden=nil) { <<Changes <<1/6/08; 6:57:09 PM by DW <<Support defaults. <<6/10/07; 12:52:56 PM by DW <<Created. <<http://www.flickr.com/services/api/upload.api.html if title == nil { title = file.filefrompath (f)}; bundle { //use defaults -- 1/6/08 by DW if description == nil { description = user.flickr.folderWatcher.defaults.description}; if flpublic == nil { flpublic = user.flickr.folderWatcher.defaults.flpublic}; if flfriend == nil { flfriend = user.flickr.folderWatcher.defaults.flfriends}; if flfamily == nil { flfamily = user.flickr.folderWatcher.defaults.flfamily}; if safetyLevel == nil { safetyLevel = user.flickr.folderWatcher.defaults.safetyLevel}; if contentType == nil { contentType = user.flickr.folderWatcher.defaults.contentType}; if flhidden == nil { flhidden = not user.flickr.folderWatcher.defaults.flnothidden}}; local (mystruct); new (tabletype, @mystruct); mystruct.api_key = user.flickr.prefs.apiKey; mystruct.auth_token = user.flickr.prefs.token; mystruct.title = title; mystruct.description = description; if tags != nil { mystruct.tags = tags}; bundle { //flpublic if flpublic { mystruct.is_public = 1} else { mystruct.is_public = 0}}; bundle { //flfriend if flfriend { mystruct.is_friend = 1} else { mystruct.is_friend = 0}}; bundle { //flfamily if flfamily { mystruct.is_family = 1} else { mystruct.is_family = 0}}; bundle { //safetyLevel mystruct.safety_level = safetyLevel}; //1 for Safe, 2 for Moderate, or 3 for Restricted bundle { //contentType mystruct.content_type = contentType}; //1 for Photo, 2 for Screenshot, or 3 for Other bundle { //flhidden if flhidden { mystruct.hidden = 2} else { mystruct.hidden = 1}}; Flickr.signStruct (@mystruct); local (boundary); bundle { //build boundary local (i); boundary = ""; for i = 1 to 5 { boundary = boundary + string.innerCaseName (states.nthState (random (1, 50)))}; boundary = string.hashmd5 (boundary)}; type = "multipart/form-data; boundary=" + boundary; local (body = ""); bundle { //build body local (indentlevel = 0); on add (s) { body = body + string.filledstring ("\t", indentlevel) + s + "\r\n"}; for adr in @mystruct { add ("--" + boundary); add ("Content-Disposition: form-data; name=\"" + nameof (adr^) + "\""); add (""); add (adr^)}; bundle { //add the picture local (type); add ("--" + boundary); add ("Content-Disposition: form-data; name=\"photo\"; filename=\"" + f + "\""); if f endswith ".gif" { type = "image/gif"} else { type = "image/jpeg"}; add ("Content-Type: " + type); add (""); add (string (file.readwholefile (f))); add ("--" + boundary + "--")}}; body = string.delete (body, sizeof (body) - 2, 2); <<wp.newtextobject (body, @scratchpad.body) local (result = tcp.httpclient ("POST", "api.flickr.com", 80, "/services/upload/", datatype:type, data:body, debug:false)); wp.newtextobject (result, @scratchpad.posttext); <<edit (@scratchpad.posttext) result = string.httpResultSplit (result); xml.compile (result, @xstruct); local (adrrsp = xml.getaddress (@xstruct, "rsp")); local (photoid = xml.getvalue (adrrsp, "photoid")); return (photoid)}; bundle { //test code <<local (tags = "Nevada Oklahoma \"South Carolina\" Massachusetts") <<clipboard.putvalue (uploadPhoto ("Macintosh HD:mtm.jpg", tags:tags)) clipboard.putvalue (uploadPhoto ("Macintosh HD:mtm.jpg"))}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.