从文件系统检索用户上传的图像,以便在Flask模板中显示

时间:2014-02-25 23:52:36

标签: python image postgresql sqlalchemy flask

我正在建立一个网站,允许我的客户创建项目列表,然后上传项目的图像。我需要的是一种将图像与其各自的元数据相关联的方法。在广泛的StackOverflow浏览和Google-fu之后,我还没有遇到一个特定的解决方案,只是模糊的引用,文件系统存储优于BLOB存储。

所以,就目前而言,我自然有一个User对象和一个Listing对象,它可以有几个相关的图像,包括一个“默认”图像。列表包含一些属性,如listing.idlisting.titlelisting.body等。

一些信息:我正在使用Python(Flask),Postgresql和SQLAlchemy。

我的初步方法。

我开始认为我会将图像文件上传到Flask的静态目录,其基本结构为:

static/
  images/
    category_1/
      listing_1/           # based on the DB id
        default.jpg        # renamed server-side to represent default view of item
        random_string.jpg  # renamed to avoid naming collisions
        random_string.gif  # renamed to avoid naming collisions
      listing_2/
        default.jpg
        random_string.png
    category_2/
      # etc.

这样我就可以根据listing.id简单地构建文件的路径。但这有一个问题:我已经允许扩展程序.pngjpg.jpeg.gif。要在模板中显示默认表示,请使用类似

的内容
glob.glob(os.path.join(app.config['UPLOAD_FOLDER'], listing.category, str(listing.id), 'default*'))

或复杂的if/elif/elif/else是必要的。这意味着像(伪代码):

for listing in listings:
  ext = rsplit_of_glob(listing.id)
  listing.ext = ext

现在情况开始显得更加模糊。这导致我

我的第二种方法。

我可以保持相同的目录结构(除非有人有任何异议),但是将图像的路径存储为数据库中的列表。它可以解决任何错误扩展的问题或者我现在看不到的一些未来的问题。

不幸的是,如果我存储完整路径,它会引入一个问题,即现在所有内容都将被硬编码。我试图避免这种情况。所以我的妥协是在数据库的每个listing行中添加一个图像列,但只包括图像的文件名+扩展名。这样我就可以根据listing.id创建路径,并且仍然拥有所有必需的信息。

真正的问题。

这些解决方案中的任何一个是在正确的道路上,还是我完全错过了一些东西?原谅我的天真。我还想知道为每个图像存储特定于图像的元数据(例如,上传时间戳)的最佳方式是什么。有些东西告诉我创建一个图像表/ SQLAlchemy图像对象是过度的。在每个listing行中存储元数据的腌制Python字典是否足够?

我意识到这是一个很大的问题,可能会因为它有些开放性而被关闭,但任何帮助都会受到赞赏。可能没有规范的答案,但有些事情告诉我必须采用最佳实践方法。

感谢。

0 个答案:

没有答案