Quiero crear un servicio en Google App Engine (Python) que recibirá una URL de una imagen y la almacenará en Google Storage. Logré cargar desde un archivo local usando boto
o gsutil
línea de comandos, pero no al recuperar el archivo a través de la URL. Intenté hacerlo usando el HTTP requests (PUT
) y obtuve respuestas de error para las firmas incorrectas. Obviamente estoy haciendo algo mal, pero desafortunadamente no tengo idea de dónde.¿Cómo se puede almacenar un archivo en Google Storage desde la URL en Google App Engine?
Así que mi pregunta es: ¿cómo puedo recuperar un archivo de una URL y almacenarlo en Google Storage usando Python para Google App Angine?
Esto es lo que he hecho (utilizando otro answer):
class ImportPhoto(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
srow = self.response.out.write
url = self.request.get('url')
srow('URL: %s\n' % (url))
image_response = urlfetch.fetch(url)
m = md5.md5()
m.update(image_response.content)
hash = m.hexdigest()
time = "%s" % datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT")
str_to_sig = "PUT\n" + hash + "\n\n" +
time + "\nx-goog-acl:public-read\n/lipis/8418.png"
sig = base64.b64encode(hmac.new(
config_credentials.GS_SECRET_ACCESS_KEY,
str_to_sig, hashlib.sha1).digest())
total = len(image_response.content)
srow('Size: %d bytes\n' % (total))
header = {"Date": time,
"x-goog-acl": "public-read",
"Content-MD5": hash,
'Content-Length': total,
'Authorization': "GOOG1 %s:%s" %
(config_credentials.GS_ACCESS_KEY_ID, sig)}
conn = httplib.HTTPConnection("lipis.commondatastorage.googleapis.com")
conn.set_debuglevel(2)
conn.putrequest('PUT', "/8418.png")
for h in header:
conn.putheader(h, header[h])
conn.endheaders()
conn.send(image_response.content + '\r\n')
res = conn.getresponse()
srow('\n\n%d: %s\n' % (res.status, res.reason))
data = res.read()
srow(data)
conn.close()
Y yo estoy como una respuesta:
URL: https://stackoverflow.com/users/flair/8418.png
Size: 9605 bytes
400: Bad Request
<?xml version='1.0' encoding='UTF-8'?><Error><Code>BadDigest</Code><Message>The Content-MD5 you specified did not match what we received.</Message><Details>lipis/hello.jpg</Details></Error>
¿Puedes publicar algún código que haga la POU y la respuesta del servidor? –
@Peter Knego Actualicé mi respuesta. – Lipis