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>
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top