Skip to content

Instantly share code, notes, and snippets.

@TechplexEngineer
Last active August 29, 2015 14:26
Show Gist options
  • Select an option

  • Save TechplexEngineer/2ddbf9c60998b024574a to your computer and use it in GitHub Desktop.

Select an option

Save TechplexEngineer/2ddbf9c60998b024574a to your computer and use it in GitHub Desktop.

I'm retrieving a Base64 encoded image from a webservice and trying to upload it to Cloudinary. I've tried a number of avenues to attempt the upload and all have seemed to fail.

So here was my first attempt. The error is: "TypeError: file() argument 1 must be encoded string without NULL bytes, not str"

#!/usr/bin/env python

import urllib2
import xml.dom.minidom
import base64

GRIDS = {
	'kitely': 'http://grid.kitely.com:8002/assets/',
	'osgrid': 'http://assets.osgrid.org/assets/'
}

NULL_KEY = '00000000-0000-0000-0000-000000000000'

class Asset:
	def __init__(self):
		pass
	@staticmethod
	def get(assetID, grid):
		b64_texture = Asset.getBase64(assetID, grid)

		texture = base64.b64decode(b64_texture)

		return texture

	@staticmethod
	def getBase64(assetID, grid):
		if assetID == NULL_KEY:
			raise Exception('NULL_KEY');

		if grid in GRIDS:
			assetURL = GRIDS[grid]
		else:
			raise Exception("Unknown Grid")

		assetURL = GRIDS[grid]+assetID
		req = urllib2.Request(assetURL)
		response = urllib2.urlopen(req)
		the_page = response.read()

		dom = xml.dom.minidom.parseString(the_page)
		root = dom.documentElement

		b64_texture = root.getElementsByTagName("Data")[0].childNodes[0].nodeValue

		return b64_texture


# Simple test routine
if __name__ == "__main__":

	import cloudinary
	import cloudinary.uploader
	import cloudinary.api

	cloudinary.config(
		cloud_name = "<cloud>",
		api_key = "<key>",
		api_secret = "<secret>"
	)

	assetID = 'da16e105-5a65-4211-a351-35cb78c9e13d'
	grid = 'osgrid'

	texture = Asset.get(assetID, grid)
	cloudinary.uploader.upload(texture, public_id='fred')

So then I thought maybe if I don't decode the Base64 image and pass it to the uploader that might work. Alas Nope. Here is the error "cloudinary.api.Error: Server returned unexpected status code - 502 - "

Here is the code:

#!/usr/bin/env python

import urllib2
import xml.dom.minidom
import base64

GRIDS = {
	'kitely': 'http://grid.kitely.com:8002/assets/',
	'osgrid': 'http://assets.osgrid.org/assets/'
}

NULL_KEY = '00000000-0000-0000-0000-000000000000'

class Asset:
	def __init__(self):
		pass
	@staticmethod
	def get(assetID, grid):
		b64_texture = Asset.getBase64(assetID, grid)

		texture = base64.b64decode(b64_texture)

		return texture

	@staticmethod
	def getBase64(assetID, grid):
		if assetID == NULL_KEY:
			raise Exception('NULL_KEY');

		if grid in GRIDS:
			assetURL = GRIDS[grid]
		else:
			raise Exception("Unknown Grid")

		assetURL = GRIDS[grid]+assetID
		req = urllib2.Request(assetURL)
		response = urllib2.urlopen(req)
		the_page = response.read()

		dom = xml.dom.minidom.parseString(the_page)
		root = dom.documentElement

		b64_texture = root.getElementsByTagName("Data")[0].childNodes[0].nodeValue

		return b64_texture


# Simple test routine
if __name__ == "__main__":

	import cloudinary
	import cloudinary.uploader
	import cloudinary.api

	cloudinary.config(
		cloud_name = "<cloud>",
		api_key = "<key>",
		api_secret = "<secret>"
	)

	assetID = 'da16e105-5a65-4211-a351-35cb78c9e13d'
	grid = 'osgrid'

	# begin -- OR --
	# texture = Asset.get(assetID, grid)
	# cloudinary.uploader.upload(texture, public_id='fred')
	#  -- OR --
	texture = Asset.getBase64(assetID, grid)
	data_url = 'data:image/jp2;base64,'+texture
	cloudinary.uploader.upload(data_url, public_id='fred')
	# end -- OR --

So then I thought that I could just write the file to disk then tell cloudinary to upload it. Nope. Error: "cloudinary.api.Error: General Error"

#!/usr/bin/env python

import urllib2
import xml.dom.minidom
import base64

GRIDS = {
	'kitely': 'http://grid.kitely.com:8002/assets/',
	'osgrid': 'http://assets.osgrid.org/assets/'
}

NULL_KEY = '00000000-0000-0000-0000-000000000000'

class Asset:
	def __init__(self):
		pass
	@staticmethod
	def get(assetID, grid):
		b64_texture = Asset.getBase64(assetID, grid)

		texture = base64.b64decode(b64_texture)

		return texture

	@staticmethod
	def getBase64(assetID, grid):
		if assetID == NULL_KEY:
			raise Exception('NULL_KEY');

		if grid in GRIDS:
			assetURL = GRIDS[grid]
		else:
			raise Exception("Unknown Grid")

		assetURL = GRIDS[grid]+assetID
		req = urllib2.Request(assetURL)
		response = urllib2.urlopen(req)
		the_page = response.read()

		dom = xml.dom.minidom.parseString(the_page)
		root = dom.documentElement

		b64_texture = root.getElementsByTagName("Data")[0].childNodes[0].nodeValue

		return b64_texture


# Simple test routine
if __name__ == "__main__":

	import cloudinary
	import cloudinary.uploader
	import cloudinary.api

	cloudinary.config(
		cloud_name = "<cloud>",
		api_key = "<key>",
		api_secret = "<secret>"
	)

	assetID = 'da16e105-5a65-4211-a351-35cb78c9e13d'
	grid = 'osgrid'

	# begin -- OR --
	# texture = Asset.get(assetID, grid)
	# cloudinary.uploader.upload(texture, public_id='fred')
	#  -- OR --
	# texture = Asset.getBase64(assetID, grid)
	# data_url = 'data:image/jp2;base64,'+texture
	# cloudinary.uploader.upload(data_url, public_id='fred')
	# -- OR --
	filename = 'test.jp2'
	with open(filename, 'a') as the_file:
		texture = Asset.get(assetID, grid)
		the_file.write(texture)

	cloudinary.uploader.upload(filename, public_id='fred')
	# end -- OR --

So then I thought that maybe it didn't like the jp2. So I wrote a small program to read a jpeg base64 encode it and try to upload it with a data_url. Nope. Error: "cloudinary.api.Error: Server returned unexpected status code - 502 - "

#!/usr/bin/env python

# send to cloudinary
import cloudinary
import cloudinary.uploader
import cloudinary.api

cloudinary.config(
  cloud_name = "<name>",
  api_key = "<key>",
  api_secret = "<secret>"
)

# open file
with open('lake.jpg', 'r') as f:
	d = f.read()

	# base 64 encode
	import base64
	e = base64.b64encode(d)

	# build URL
	# print e
	data_url = 'data:image/jpeg;base64,'+e
	# print data_url
	cloudinary.uploader.upload(data_url)

So then I tried uploading the file(test.jp2) with the web interface. Nope. Error: "Upload failed: General Error" (See screenshot)

I'm out of ideas. Please advise of next steps. Am I doing something really wrong?

#!/usr/bin/env python
import urllib2
import xml.dom.minidom
import base64
GRIDS = {
'kitely': 'http://grid.kitely.com:8002/assets/',
'osgrid': 'http://assets.osgrid.org/assets/'
}
NULL_KEY = '00000000-0000-0000-0000-000000000000'
class Asset:
def __init__(self):
pass
@staticmethod
def get(assetID, grid):
b64_texture = Asset.getBase64(assetID, grid)
texture = base64.b64decode(b64_texture)
return texture
@staticmethod
def getBase64(assetID, grid):
if assetID == NULL_KEY:
raise Exception('NULL_KEY');
if grid in GRIDS:
assetURL = GRIDS[grid]
else:
raise Exception("Unknown Grid")
assetURL = GRIDS[grid]+assetID
req = urllib2.Request(assetURL)
response = urllib2.urlopen(req)
the_page = response.read()
dom = xml.dom.minidom.parseString(the_page)
root = dom.documentElement
b64_texture = root.getElementsByTagName("Data")[0].childNodes[0].nodeValue
return b64_texture
# Simple test routine
if __name__ == "__main__":
import cloudinary
import cloudinary.uploader
import cloudinary.api
cloudinary.config(
cloud_name = "<cloud>",
api_key = "<key>",
api_secret = "<secret>"
)
assetID = 'da16e105-5a65-4211-a351-35cb78c9e13d'
grid = 'osgrid'
texture = Asset.get(assetID, grid)
cloudinary.uploader.upload(texture, public_id='fred')
#!/usr/bin/env python
import urllib2
import xml.dom.minidom
import base64
GRIDS = {
'kitely': 'http://grid.kitely.com:8002/assets/',
'osgrid': 'http://assets.osgrid.org/assets/'
}
NULL_KEY = '00000000-0000-0000-0000-000000000000'
class Asset:
def __init__(self):
pass
@staticmethod
def get(assetID, grid):
b64_texture = Asset.getBase64(assetID, grid)
texture = base64.b64decode(b64_texture)
return texture
@staticmethod
def getBase64(assetID, grid):
if assetID == NULL_KEY:
raise Exception('NULL_KEY');
if grid in GRIDS:
assetURL = GRIDS[grid]
else:
raise Exception("Unknown Grid")
assetURL = GRIDS[grid]+assetID
req = urllib2.Request(assetURL)
response = urllib2.urlopen(req)
the_page = response.read()
dom = xml.dom.minidom.parseString(the_page)
root = dom.documentElement
b64_texture = root.getElementsByTagName("Data")[0].childNodes[0].nodeValue
return b64_texture
# Simple test routine
if __name__ == "__main__":
import cloudinary
import cloudinary.uploader
import cloudinary.api
cloudinary.config(
cloud_name = "<cloud>",
api_key = "<key>",
api_secret = "<secret>"
)
assetID = 'da16e105-5a65-4211-a351-35cb78c9e13d'
grid = 'osgrid'
# begin -- OR --
# texture = Asset.get(assetID, grid)
# cloudinary.uploader.upload(texture, public_id='fred')
# -- OR --
texture = Asset.getBase64(assetID, grid)
data_url = 'data:image/jp2;base64,'+texture
cloudinary.uploader.upload(data_url, public_id='fred')
# end -- OR --
#!/usr/bin/env python
import urllib2
import xml.dom.minidom
import base64
GRIDS = {
'kitely': 'http://grid.kitely.com:8002/assets/',
'osgrid': 'http://assets.osgrid.org/assets/'
}
NULL_KEY = '00000000-0000-0000-0000-000000000000'
class Asset:
def __init__(self):
pass
@staticmethod
def get(assetID, grid):
b64_texture = Asset.getBase64(assetID, grid)
texture = base64.b64decode(b64_texture)
return texture
@staticmethod
def getBase64(assetID, grid):
if assetID == NULL_KEY:
raise Exception('NULL_KEY');
if grid in GRIDS:
assetURL = GRIDS[grid]
else:
raise Exception("Unknown Grid")
assetURL = GRIDS[grid]+assetID
req = urllib2.Request(assetURL)
response = urllib2.urlopen(req)
the_page = response.read()
dom = xml.dom.minidom.parseString(the_page)
root = dom.documentElement
b64_texture = root.getElementsByTagName("Data")[0].childNodes[0].nodeValue
return b64_texture
# Simple test routine
if __name__ == "__main__":
import cloudinary
import cloudinary.uploader
import cloudinary.api
cloudinary.config(
cloud_name = "<cloud>",
api_key = "<key>",
api_secret = "<secret>"
)
assetID = 'da16e105-5a65-4211-a351-35cb78c9e13d'
grid = 'osgrid'
# begin -- OR --
# texture = Asset.get(assetID, grid)
# cloudinary.uploader.upload(texture, public_id='fred')
# -- OR --
# texture = Asset.getBase64(assetID, grid)
# data_url = 'data:image/jp2;base64,'+texture
# cloudinary.uploader.upload(data_url, public_id='fred')
# -- OR --
filename = 'test.jp2'
with open(filename, 'a') as the_file:
texture = Asset.get(assetID, grid)
the_file.write(texture)
cloudinary.uploader.upload(filename, public_id='fred')
# end -- OR --
#!/usr/bin/env python
# send to cloudinary
import cloudinary
import cloudinary.uploader
import cloudinary.api
cloudinary.config(
cloud_name = "<name>",
api_key = "<key>",
api_secret = "<secret>"
)
# open file
with open('lake.jpg', 'r') as f:
d = f.read()
# base 64 encode
import base64
e = base64.b64encode(d)
# build URL
# print e
data_url = 'data:image/jpeg;base64,'+e
# print data_url
cloudinary.uploader.upload(data_url)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment