5

画像のURLを受信して​​Googleストレージに保存するサービスをGoogleAppEngine(Python)で作成したいと思います。botoまたはgsutilコマンドラインを使用してローカルファイルからアップロードできましたが、URLを介してファイルを取得することはできませんでした。HTTPリクエスト(PUTを使用して試してみましたが、間違った署名に対してエラー応答が返されます。明らかに私は何か間違ったことをしているのですが、残念ながらどこにいるのかわかりません。

だから私の質問は:URLからファイルを取得し、Python for Google AppAngineを使用してGoogleStorageに保存するにはどうすればよいですか?

これが私がしたことです(別の答えを使用して):

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()

そして、私は応答として得ています:

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>
4

2 に答える 2

1

リクエストに署名する方法に関するドキュメントを読みましたか?署名する文字列には、カスタムヘッダーとリソースパスに加えてContent-MD5Content-Typeとヘッダーが含まれている必要があります。Date

于 2010-11-05T13:37:36.167 に答える
1

Content-MD5header はPUT リクエストのオプションです。テストのためにこれを除外してみてください。

また、必要なヘッダーはAuthorizationDateおよびHostです。リクエストのHostヘッダーが欠落しているようです。

于 2010-11-05T13:44:10.870 に答える