Wie kann eine Datei auf Google Storage von URL auf Google App Engine speichern?
-
29-09-2019 - |
Frage
Ich möchte einen Dienst auf Google App Engine (Python) erstellen, die eine URL eines Bildes erhalten und bewahren Sie sie auf Google Storage. Ich schaffte es aus einer lokalen Datei mit boto
oder gsutil
Befehlszeilen zu laden, aber nicht durch die Datei per URL abgerufen werden. Ich habe versucht, es zu tun mit den HTTP-Anfragen (PUT
) und ich erhalte Fehlerreaktionen für falsche Signaturen. Offensichtlich mache ich etwas falsch, aber leider habe ich keine Ahnung, wo.
Also meine Frage ist: Wie kann ich eine Datei von einer URL abrufen und speichern Sie es auf Google Storage Python für Google App Angine
Hier ist, was ich getan habe (unter Verwendung eines anderen Antwort ):
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()
Und ich als Antwort bekommen:
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>
Lösung
Haben Sie die Dokumentation lesen auf , wie Anfragen zu unterschreiben ? Die Zeichenfolge Zeichen enthält Angaben über die Content-MD5
, Content-Type
und Date
Header, zusätzlich zu den benutzerdefinierten Header und der Ressourcenpfad.
Andere Tipps
Content-MD5
Header ist optional für PUT-Anfragen . Versuchen Sie verlassen diese aus für einen Test.
Auch erforderlichen Header sind Authorization
, Date
und Host
. Es scheint, dass Ihre Anfrage Host
Header fehlt.