1

是否有可能从Python脚本使用谷歌应用程序引擎python图像库从本地文件系统加载图像文件?还是必须从数据存储加载图像?我可以成功加载文本文件并显示其内容。从文件系统谷歌应用程序引擎加载图像

我正在使用谷歌应用程序引擎与Python 2.7和使用PIL图像库。我在Mac OS X 10.8.2上使用PyCharm和Google App Engine Launcher。我使用从源代码构建的PIL版本1.1.7。

我想在图像(或图像)上执行一些操作,然后将它们返回到我的python脚本的响应输出中。

当我使用Image.image(filename=<filename>)函数时,我得到的错误告诉我文件名必须以“/ gs”开头。步入Image对象的__init()__方法向我显示,如果我向Image构造函数提供文件名,则使用blobstore.create_gs_key()创建blobkey。

因为我有一组固定的图像,我希望能够避免必须手动将它们上传到数据存储中进行检索。

我的微不足道的应用程序处理程序目前看起来像这样;

class ChallengeImageHandler(webapp2.RequestHandler): 
    def get(self): 
     olifant = images.Image(filename='gs/challenge/C017.png') 
     logging.debug("olifant.width=%d" % olifant.width); 
     logging.debug("olifant.height=%d" % olifant.height); 
     self.response.headers[ 'Content-Type' ] = 'image/png' 
     self.response.out.write(olifant) 
     return 

我的app.yaml看起来像这样;

application: hello_world 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 


handlers: 

- url: /stylesheets 
    static_dir: stylesheets 

- url: /images 
    static_dir: images 

- url: /.* 
    script: main.application 

- url: /software_development.html 
    script: main.application 

libraries: 
- name: jinja2 
    version: latest 
- name: PIL 
    version: latest 

我明白,我可以静态地服务于图像达到同样的效果,但一旦我已经设法成功加载图像,我希望为它服务之前对其进行操作。我故意将我希望从我的应用程序加载的图像放置在不同于/images的目录中,而不是由Google应用程序引擎Web服务器将其作为静态内容。它们位于名为gs/challenge的子目录中。

任何援助,建议或解决方案非常感谢。也许我正在以完全错误的方式解决这个问题?

回答

0

如果您只需将它们与应用程序一起上传,就可以从本地文件系统加载文件。

只要您意识到他们永远不会改变,除非部署应用程序,并且部署的应用程序可占用的空间量有限制,否则无法更改它们,您应该可以。

例如,我将一个.csv文件与我的应用程序一起上传,并在第一次启动时将其读取并在与其内容相关的数据存储中创建一条记录。然后我再也不使用该文件。

你放置图像的位置并不相关,因为在将它们提供给用户之前,他们正在操作它们,因此它们不是“静态内容”,因此不会直接提供给用户(作为.css文件将是例如)。只要你的应用程序可以加载它们,那就是正确的地方。

+0

我不同意。您可以将图像放入Blobstore中,并使用带有get_serving_url的Google高性能图像服务。这不是非常快,但你也不必自己提供图像,而且几乎是免费的。这是一个get_serving_url的例子:https://lh6.ggpht.com/1HjICy6ju1e2GIg83L0qdliUBmPHUgKV8FP3QGK8Qf2pHVBfwkpO_V38ifAPm-9m20q_3ueZzdRCYQNyDE3pmA695iaLunjE=s0 – voscausa

+0

我并不反对这一切,但提问者似乎想避免,由于某种原因,把这个内容在任何类型的blobstore。我个人会按你的建议去做。 –

+0

PaulC,感谢您的回复。我已经能够加载一个文本文件并显示它的内容。所以我明白可以在app引擎项目中打开/加载文件。我在做什么特别麻烦,是从本地文件系统加载图像。我准备使用blobstore,只是想知道如果没有额外的步骤是否可能。 – DavrosYoung

0

你是部分错误/右,我终于能够使用PIL这种方式,一些进口的可能是不必要的从内存中打开一个文件,但W/E:

from PIL import Image, ImageDraw, ImageFont 
from io import BytesIO 

rawdata = open(fullpathtoimagefile).read() 
stream = BytesIO(rawdata) 
im = Image.open(stream)