首页 > 解决方案 > Flask - 将用户上传的图像提供给网页

问题描述

所以我正在开发一个 Flask 应用程序,它几乎是一个属性管理器,允许用户上传他们的属性图像。我是 Flask 的新手,以前从未处理过图像。从大量谷歌搜索中,我了解到有多种方法可以管理图像等静态文件。

一种方法是允许用户将图像直接上传到文件系统,然后通过使用以下方式检索静态文件夹中的文件位置来显示它:

<img src="static/images/filename.jpg">

但是,这真的是一种有效的方法吗,因为这意味着在数据库中存储每个图像 URL 的生成和存储位置?尤其是在部署应用程序时?我发现的另一种方法是使用 base64 编码并将图像直接存储到数据库中,这听起来也不是很有效。

我认为最好的另一种方法是使用 AWS S3 存储桶。然后,用户将能够将图像直接上传到该存储桶并被分配到该图像的 URL。此 URL 存储在数据库中,然后可用于显示图像,类似于文件系统方法。我对此的理解正确吗?有没有更好的方法来解决这个问题?有没有类似于django-storages 的东西可以用来将 Flask 连接到 S3?

任何输入或指出我正确的方向将不胜感激。谢谢!

标签: pythonflaskamazon-s3flask-sqlalchemy

解决方案


如果您想将图像存储在 Web 服务器中,那么最好的方法是在烧瓶前使用 nginx 作为代理,让 nginx 为所有图像提供静态文件夹。

Nginx 对于一个小型网站来说已经足够了。不要尝试使用烧瓶提供文件。它太慢了。

如果要将图像存储在 s3 中,则只需将图像名称存储在数据库中的存储桶中。您可以告诉烧瓶使用 s3 存储桶作为静态文件夹。您可以在 python 中使用 boto3 库来访问 s3。 https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html

如果您担心将 s3 存储桶暴露给用户,那么您可以使用云端分发。它的服务价格更便宜,而且还隐藏了你的水桶。


推荐阅读