2010-11-05 8 views
5

मैं Google ऐप इंजन (पायथन) पर एक सेवा बनाना चाहता हूं जो एक छवि का यूआरएल प्राप्त करेगा और इसे Google संग्रहण पर संग्रहीत करेगा। मैं boto या gsutil कमांड लाइन का उपयोग कर स्थानीय फ़ाइल से अपलोड करने में कामयाब रहा, लेकिन यूआरएल के माध्यम से फाइल को पुनः प्राप्त नहीं कर पाया। मैंने HTTP requests (PUT) का उपयोग करके इसे करने का प्रयास किया और मुझे गलत हस्ताक्षर के लिए त्रुटि प्रतिक्रियाएं मिल रही हैं। जाहिर है, मैं कुछ गलत कर रहा हूं, लेकिन दुर्भाग्य से मुझे पता नहीं है कि कहां है।Google App Engine पर URL से Google संग्रहण पर फ़ाइल कैसे संग्रहीत कर सकते हैं?

तो मेरा सवाल यह है कि: मैं एक यूआरएल से एक फाइल कैसे प्राप्त कर सकता हूं और इसे Google ऐप एंजिन के लिए पाइथन का उपयोग करके Google संग्रहण पर संग्रहीत कर सकता हूं?

यहाँ मैं क्या किया है (का उपयोग करते हुए एक और 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() 

और मैं एक प्रतिक्रिया के रूप हो रही है:

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> 
+0

क्या आप कुछ कोड पोस्ट कर सकते हैं जो पीओयू और सर्वर उत्तर देता है? –

+0

@ पीटर Knego मैंने अपना जवाब अपडेट किया। – Lipis

उत्तर

1

आप how to sign requests पर डॉक्स पढ़ा है? कस्टम हेडर और संसाधन पथ के अतिरिक्त, हस्ताक्षर करने के लिए स्ट्रिंग में Content-MD5, Content-Type और Date हेडर शामिल होना चाहिए।

+0

मैंने किया लेकिन मैं इसे काम नहीं कर सकता। क्या आप मुझे एक उदाहरण दे सकते हैं कि मैं कोशिश कर सकता हूं? – Lipis

+0

आप उन शीर्षकों को शामिल नहीं कर रहे हैं जो आपके द्वारा दिए गए उदाहरण कोड में साइन इन करते हैं। उन्हें दस्तावेज़ के रूप में जोड़ने का प्रयास करें, और यदि यह अभी भी काम नहीं करता है, तो हमें उस कोड को दिखाएं जिसका आप उपयोग कर रहे हैं। –

+0

धन्यवाद .. मैन्युअल के माध्यम से फिर से काम करने के बाद यह काम किया: डी – Lipis

1

Content-MD5 शीर्षलेख PUT requests के लिए वैकल्पिक है। एक परीक्षण के लिए इसे छोड़ने का प्रयास करें।

इसके अलावा, आवश्यक हेडर Authorization, Date और Host हैं। ऐसा लगता है कि आपका अनुरोध Host शीर्षलेख गुम है।

+0

जब मैंने मेजबान जोड़ा तो मुझे अभी भी एक ही त्रुटि मिल रही थी। जब मैंने सामग्री-एमडी 5 हटा दिया तो मुझे एक * 403 मिल रहा है: निषिद्ध * _ हमारे द्वारा गणना किए गए अनुरोध हस्ताक्षर आपके द्वारा प्रदान किए गए हस्ताक्षर से मेल नहीं खाते हैं। अपनी Google गुप्त कुंजी जांचें और विधि पर हस्ताक्षर करें ._ – Lipis

+0

मैन्युअल रूप से PUT अनुरोध बनाने के लिए क्रोम पॉटर या फ़ायरफ़ॉक्स पोस्टर प्लगइन का उपयोग करने का प्रयास करें। जब तक आप इसे सही न हो जाएं तब तक विभिन्न शीर्षलेखों से जांचें। फिर इसे कोड में स्थानांतरित करें। https://chrome.google.com/extensions/detail/cdjfedloinmbppobahmonnjigpmlajcd?hl=hi https://addons.mozilla.org/en-US/firefox/addon/2691/ –

+0

इसे काम करने के लिए नहीं कर सकता है। मुझे लगता है कि मेरा हस्ताक्षर गलत है इसलिए मुझे इसे पोस्टर पर रखने का अधिकार नहीं मिल सकता है :(क्या मैं उपरोक्त कोड में इसकी गणना कैसे कर सकता हूं? – Lipis