2016-12-12 4 views
0

В качестве ссылки я использую http://cloudinary.com/documentation/image_upload_api_reference.Правильный способ загрузки байтов изображения в облачный

Есть два случая, когда я хочу загрузить файлы в облачный.

  1. Загрузить изображение, напрямую указав ссылку на ссылку.
  2. Загрузите байты изображений, взяв их из разных источников.

Я мог бы решить случай 1, но имел проблемы во втором. Я вставляю свой поток кода ниже для справки.

import cloudinary 
import cloudinary.uploader 

from io import BytesIO 
from StringIO import StringIO 

def upload_image_to_cloudinary(img_tag): 

    logging.debug("Uploading Image to cloudinary : %s"%img_tag) 

    if 'src' not in img_tag.attrs: 
    del img_tag 
    return 

    img_src = img_tag['src'] 

    if img_src.startswith('/blob'): 

    quip_client = pgquip.get_client() 
    blob_ids = img_src.split('/') 
    blob_response = quip_client.get_blob(blob_ids[2], blob_ids[3]) 

    img_src_str = blob_response.read() # this returns str object. 
    # img_src = BytesIO(img_src_str) 
    img_src = StringIO(img_src_str) 

    cloudinary_response = cloudinary.uploader.upload_image(
    img_src, 
    use_filename=True, 
    folder="/pagalguy/articles", 
    width=546, 
    crop="limit" 
) 

    img_tag['src'] = cloudinary_response.metadata.get("url") 

    return img_tag 

В случае, когда img_src это изображение блоб str возвращается другой апи, я передал его как file парам упоминается в cloudinary документ в очень похожим образом, как и любой внешний URL изображения для например: https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAIkAAAAJGRhNzJiYjY1LTUxOTctNDI4NC1hOGIwLWQ1OTVlNmZlZmVmYw.jpg

И , для проверки того, как общие потоки загрузки работают как boto для s3, я проверяю ниже код репо. Ссылается https://github.com/boto/boto/blob/develop/boto/vendored/six.py#L633 это тоже.

Журнал ошибок:

Invalid URL for upload Traceback (most recent call last): File "/base/data/home/apps/s~pagalguy-staging/namita:v1.397698162588746989/articleslib/article_util.py", line 68, in upload_images_n_publish tag = image_util.upload_image_to_cloudinary(tag) File "/base/data/home/apps/s~pagalguy-staging/namita:v1.397698162588746989/api/image_util.py", line 133, in upload_image_to_cloudinary crop="limit" File "/base/data/home/apps/s~pagalguy-staging/namita:v1.397698162588746989/libs/cloudinary/uploader.py", line 23, in upload_image result = upload(file, **options) File "/base/data/home/apps/s~pagalguy-staging/namita:v1.397698162588746989/libs/cloudinary/uploader.py", line 17, in upload return call_api("upload", params, file = file, **options) File "/base/data/home/apps/s~pagalguy-staging/namita:v1.397698162588746989/libs/cloudinary/uploader.py", line 226, in call_api raise Error(result["error"]["message"]) Error: Invalid URL for upload

Наконец, я не знаю, что правильный способ загрузить байты изображения в cloudinary.

+0

, для которого определение "не работает"? –

+0

пробовал пропустить 'StringIO.StringIO (img_src)' и 'io.BytesIO (img_src)', не работал. И я попробовал 'upload_image', а также' upload' definition.! –

+1

Для написания вслух: ДЛЯ ОПРЕДЕЛЕНИЯ «НЕ РАБОТАЕТ»? «не работает» является самым бесполезным возможным описанием проблемы. Если вы надеетесь получить какую-либо помощь, пожалуйста, сообщите, что вы ожидали и что произошло точно (с полной трассировкой, если у вас есть и т. Д.). –

ответ

0

Ваш img_src параметр, который представляет file, должен быть заполнен либо байтом массива байтов (bytearray), либо URI Base64. Вы можете попробовать что-то вроде:

with open(img_src_str, "rb") as imageFile: 
     f = imageFile.read() 
     img_src = bytearray(f) 

    cloudinary_response = cloudinary.uploader.upload(
     img_src, 
     ... 
    ) 
+0

1. да есть: https://github.com/cloudinary/pycloudinary/blob/master/cloudinary/uploader.py#L43 2. Если переданный объект является файлоподобным объектом (имеет вызываемый 'read' атрибут) используется как файл cf https://github.com/cloudinary/pycloudinary/blob/master/cloudinary/uploader.py#L234 –

+0

Спасибо, что указали мне метод 'upload_iamge', полностью пропустили его. –

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