6

के माध्यम से ब्लॉबस्टोर छवि की सेवा करना मैं एक ऐप-इंजन एंडपॉइंट एपीआई बना रहा हूं जो उपयोगकर्ता (एंड्रॉइड ऐप) से चित्र लेता है और इसे प्रोग्रामेटिक रूप से ब्लॉबस्टोर में सहेजता है। फिर मैं अपने डेटास्टोर में blob_key को बचाता हूं। कोड इस प्रकार है:ऐप-इंजन एंडपॉइंट्स एपीआई

  • सबसे पहले मैं के माध्यम से अपने @endpoint.method एक messages.BytesField के रूप में छवि प्राप्त किया:

    image_data = messages.BytesField (1, आवश्यक = सच)

तब मैं इस तरह ब्लॉबस्टोर में सहेजें:

from google.appengine.api import files 

def save_image(data): 
    # Create the file 
    file_name = files.blobstore.create(mime_type='image/png') 

    # Open the file and write to it 
    with files.open(file_name, 'a') as f: 
    f.write('data') 

    # Finalize the file. Do this before attempting to read it. 
    files.finalize(file_name) 

    # Get the file's blob key 
    blob_key = files.blobstore.get_blob_key(file_name) 
    return blob_key # which is then saved to datastore 

अब मैं छवि की सेवा करना चाहता हूं वापस। मैं नहीं दिख रहा है कि मेरे अंतिम बिंदु API में निम्न कोड फिट करने के लिए:

from google.appengine.ext import blobstore 
from google.appengine.ext.webapp import blobstore_handlers 
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self, resource): 
    resource = str(urllib.unquote(resource)) 
    blob_info = blobstore.BlobInfo.get(resource) 
    self.send_blob(blob_info) 

अंत मैं इस तरह एक सेवारत प्रक्रिया की कल्पना में:

  • @ endpoints.method में

    :

  • प्राप्त blob_key डेटास्टोर से

  • blob_key साथ छवि प्राप्त

  • सामने के अंत (Android एप्लिकेशन)

मेरे दृष्टिकोण है क्योंकि मैं अपने उपयोगकर्ताओं की गोपनीयता की रक्षा करना चाहते हैं के लिए भेजें StuffResponseMessage StuffResponseMessage

  • में चित्र जोड़ी। यह कैसे अच्छी तरह से करने के बारे में कोई विचार? My code snippets are generally from the google developer tutorial


    संपादित करें:

    मैं नहीं दिख रहा है कि कैसे मैं छवि को पुनः प्राप्त करने के लिए निम्न विधि को डेटास्टोर से blob_key पारित होगा:

    from google.appengine.ext import blobstore 
    from google.appengine.ext.webapp import blobstore_handlers 
    class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
        def get(self, resource): 
        resource = str(urllib.unquote(resource)) 
        blob_info = blobstore.BlobInfo.get(resource) 
        self.send_blob(blob_info) 
    

    क्या अंदर resource है, वैसे?

  • +1

    यदि आप पाइथन 2.7 का उपयोग कर रहे हैं तो आपको __future__ आयात से _statement' की आवश्यकता नहीं है। – bossylobster

    +0

    आह। धन्यवाद, @ बॉसिलोबस्टर। मैंने इसे बाहर निकाला – learner

    उत्तर

    2

    मेरा मानना ​​है कि resourceBlobKey एक स्ट्रिंग के रूप में, जो यूआरएल पथ से पुनः प्राप्त किया गया है, की वस्तु है। यदि आप google.appengine.ext.blobstore.BlobInfo के स्रोत को देखते हैं तो get विधि फ़ंक्शन __normalize_and_convert_keys का उपयोग करती है जो BlobKey ऑब्जेक्ट या स्ट्रिंग का तर्क देती है।

    यदि ब्लॉब एक ​​छवि है, तो हो सकता है कि आपके एंड्रॉइड ऐप के बजाय StuffResponseMessage में सेवा यूआरएल भेजना सबसे अच्छा हो। गूगल के एक ब्लॉब डॉक की सेवा से:

    आप छवियों की सेवा कर रहे हैं, एक अधिक कुशल और संभावित रूप से कम महंगे विधि send_blob बजाय App इंजन छवियाँ एपीआई का उपयोग कर get_serving_url उपयोग करने के लिए है। Get_serving_url फ़ंक्शन आपको अपने ऐप इंजन उदाहरणों के बिना सीधे छवि की सेवा करने देता है।

    तो आप छवि को बचाने के बाद, लौटे blob_key एक सेवारत यूआरएल बनाने के लिए ले (अपने विधि ऊपर save_image(data) के अनुसार), तो अपने Android एप्लिकेशन में लौटे यूआरएल से छवि मिलता है। इसका मतलब है गोपनीयता नीति के बिना छवि यूआरएल उजागर करना।

    यदि आप इसे सुरक्षा के साथ करना चाहते हैं, तो इंटरफ़ेस जैसी फ़ाइल के साथ ब्लॉब पढ़ने के लिए BlobReaderclass का उपयोग करें। आप एक ब्लॉब उदाहरण की सेवा से विधि/वर्ग का उपयोग नहीं कर सकते हैं क्योंकि आप इसे हैंडलर के बजाय remote.Service उप-वर्ग में करते हैं।

    +0

    एंड्रॉइड से एंडपॉइंट (सर्वर) से ब्लॉब भेजने के लिए मुझे इसे एन्कोड करने की आवश्यकता है? (बेस 64) या यह पहले से ही संभाला गया है? – learner

    +0

    @ स्लेनर ने सेवा देने वाला यूआरएल दिया है, आप इसे किसी अन्य बाहरी छवि की तरह संभाल सकते हैं। यह जवाब देखें [एंड्रॉइड छवि लाने] [http://stackoverflow.com/a/2909460/15229 9 0) – panjiesw

    संबंधित मुद्दे