0

У меня есть веб-приложение Flask, работающее в Google AppEngine. Приложение имеет форму, которую мой пользователь будет использовать для предоставления ссылок на изображения. Я хочу загрузить данные изображения из ссылки, а затем загрузить ее в ведро Google Cloud Storage.Загрузка данных изображения затем загрузка в Google Cloud Storage

Что я нашел до сих пор в документации Google, я предлагаю использовать библиотеку клиентов cloudstorage, которую я установил и импортировал как «gcs».
найдено здесь: https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/read-write-to-cloud-storage

Я думаю, что не правильно обрабатываю данные изображения через запросы. Я получаю код 200 из вызова загрузки облачного хранилища, но нет объекта, когда я ищу его в консоли. Вот где я стараюсь, чтобы получить изображение, а затем загрузить его:

img_resp = requests.get(image_link, stream=True) 
objectName = '/myBucket/testObject.jpg' 

gcs_file = gcs.open(objectName, 
        'w', 
        content_type='image/jpeg') 
gcs_file.write(img_resp) 
gcs_file.close() 

редактировать: Вот мой обновленный код, чтобы отразить предложение ответа в:

image_url = urlopen(url) 
content_type = image_url.headers['Content-Type'] 
img_bytes = image_url.read() 
image_url.close() 

filename = bucketName + objectName 
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(img_bytes) 
    f.close() 

Однако, я все еще получаю 201 ответ на вызов POST (создать файл), а затем 200 на вызов PUT, но объект никогда не появляется в консоли.

ответ

1

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

from google.appengine.api import images 
import urllib2 

image = urllib2.urlopen(image_url) 

img_resp = image.read() 
image.close() 

objectName = '/myBucket/testObject.jpg' 
options = {'x-goog-acl': 'public-read', 
     'Cache-Control': 'private, max-age=0, no-transform'} 

with gcs.open(objectName, 
       'w', 
       content_type='image/jpeg', 
       options=options) as f: 

    f.write(img_resp) 
    f.close() 

И почему ограничивают их просто введя URL. Почему бы не дать им возможность загрузить локальный образ:

if isinstance(image_or_url, basestring): # should be url 
    if not image_or_url.startswith('http'): 
     image_or_url = ''.join([ 'http://', image_or_url]) 
    image = urllib2.urlopen(image_url) 
    content_type = image.headers['Content-Type'] 
    img_resp = image.read() 
    image.close() 
else: 
    img_resp = image_or_url.read() 
    content_type = image_or_url.content_type 

Если вы работаете на сервере разработки, файл будет загружен в локальное хранилище. Проверьте это по адресу:

http://localhost:<your admin port number>/datastore?kind=__GsFileInfo__ 

и

http://localhost:<your admin port number>/datastore?kind=__BlobInfo__ 
+0

Я попытаюсь это, благодаря –

+0

Там до сих пор нет ни одного объекта, показывая в ведро. Я получаю 201 от GCS для вызова объекта создания, а затем 200 для вызова PUT, так что это не значит, что это было успешным? Кроме того, это выполняется на сервере dev_appserver.py –

+0

Я только что отредактировал, чтобы добавить некоторые параметры для ведра и использовать оператор 'with' для записи. Можете ли вы проверить ввод формы и что это правильный URL-адрес, указывающий на jpg-образ? (лучше всего установить 'content_type = content_type' и получить программный код content_type, как во второй части моего ответа.) – GAEfan

Смежные вопросы