Как передать динамически создать файл Powerpoint в Google Cloud Storage в Python - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать power-point в своем приложении на python 2.7 и загрузить его на лету в Google Cloud Storage.

Я могу создать ppt, сохранить на локальном жестком диске в качестве промежуточного шага, а затем забрать его для загрузки в облачное хранилище Google.Это хорошо работает.Однако мое производственное приложение будет работать на сервере приложений Google, поэтому я хочу иметь возможность создавать PowerPoint и загружать его в Google Storage напрямую (без промежуточного шага).

Есть идеи, как это сделать?Похоже, что blob.upload_from_file () может извлекать только те файлы, которые где-то физически хранятся, но поскольку мое приложение строит эти powerpoints, я не знаю, что передать в качестве аргумента blob.upload_from_file?Я пытался использовать модуль StringIO, но он генерирует сообщение об ошибке ниже.

from google.cloud import storage
from pptx import Presentation
from StringIO import StringIO

prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"

out_file = StringIO()
prs.save(out_file)

client = storage.Client()

bucket = client.get_bucket([GCP_Bucket_Name])

blob = bucket.blob('test.pptx')
blob.upload_from_file(out_file)
print blob2.public_url

ValueError: Поток должен быть в начале.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я решил эту проблему, переместив свое приложение GAE из стандартной среды в гибкую среду в GAE.Гибкая среда позволяет записать файл preso в корневой каталог, и я забираю его оттуда, загружаю в хранилище Google, а затем удаляю файл в корневом каталоге.Это сработало для меня.

0 голосов
/ 07 февраля 2019

Вы загружаете объект out_file, который является просто пустым объектом StringIO.

Вместо этого вам необходимо:

  1. Сохранить объект презентации в файловой системе prs.save(savingPath)
  2. Прочитайте объект и поместите его в объект StringIO.
  3. Наконец, загрузите объект StringIO.

Вот код:

from google.cloud import storage
from pptx import Presentation
from StringIO import StringIO

#Creates presentation
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"

prs.save('test.pptx')

client = storage.Client()

bucket = client.get_bucket('yourBucket')
blob = bucket.blob('test.pptx')

with open('test.pptx','r') as ppt:
    out_file = StringIO(ppt.read())

blob.upload_from_file(out_file)
print blob.public_url


Наконец, вы упомянули кодбудет работать на сервере приложений Google, этот продукт не существует.Если вы имели в виду Google App Engine, имейте в виду, что не все среды выполнения имеют доступ к файловой системе .Таким образом, вы не сможете сохранить файл pptx в файловой системе приложения.

...