2014-12-23 5 views
1

Я работаю над новостным приложением и хотел бы кэшировать новостные изображения на своем собственном облачном хранилище Google.Как загрузить изображение из Интернета в Google Cloud Storage?

Я планирую использовать колбу на GAE. Все примеры, которые я нашел, связаны с загрузкой файла из браузера пользователя в облачное хранилище.

Каков наилучший способ получить изображение с помощью URL-адреса и загрузить его в облако Google Cloud? Надеюсь, это имеет смысл, пожалуйста, предлагайте улучшения. Большое спасибо

def main(): 
    bucket_name = os.environ.get('BUCKET_NAME', 
           app_identity.get_default_gcs_bucket_name()) 
    bucket = '/' + bucket_name 
    filename = bucket + '/image_name' 
    image_url = "http://news.com/crash.jpg" 
    try: 
     create_file(image_url, filename) 
    except Exception, e: 
     logging.exception(e) 
    return "Success", 201 


def create_file(image_url, filename): 
    image = cStringIO.StringIO(urllib.urlopen(image_url).read()) // Not sure about this 
    img = Image.open(image) 
    write_retry_params = gcs.RetryParams(backoff_factor=1.1) 
    gcs_file = gcs.open(filename, 
        'w', 
        content_type='image/jpeg', // ???? Is MIME type correct? 
        options={'x-goog-acl': 'public'}, 
        retry_params=write_retry_params) 
    gcs_file.write(img) 
    gcs_file.close() 

ответ

4

Попробуйте это:

import urllib2 
from google.appengine.api import images 
import cloudstorage as gcs 

image_at_url = urllib2.urlopen(url) 
content_type = image_at_url.headers['Content-Type'] 
filename = #use your own or get from file 

image_bytes = image_at_url.read() 
image_at_url.close() 
image = images.Image(image_bytes) 

# this comes in handy if you want to resize images: 
if image.width > 800 or image.height > 800: 
    image_bytes = images.resize(image_bytes, 800, 800) 

options={'x-goog-acl': 'public-read', 'Cache-Control': 'private, max-age=0, no-transform'} 
with gcs.open(filename, 'w', content_type=content_type, options=options) as f: 
    f.write(image_bytes) 
    f.close() 
+0

Большое спасибо. 1) Я не думаю, что вам нужно 'image = images.Image (image_bytes)' больше. 2) код выглядит очень многообещающим, но он не работает. Ты это пробовал? – Houman

+0

Да, это действительно работает. Я использую это с моими флеш-приложениями. Убедитесь, что вы предоставили разрешение на использование GAE для вашего ведра: https://developers.google.com/appengine/docs/python/googlestorage/index#Prerequisites Я добавил комментарий о том, почему я использую преобразование изображения – GAEfan

+0

Он работает сейчас. Большое спасибо за вашу помощь. Отличная идея с изменением размера изображений. Я предполагаю, что имею такое требование, как это означает, я не могу использовать BlobStorage и должен придерживаться Cloud Storage, так как запись файла прежнего устарела. благодаря – Houman