python - Flask - 将用户上传的图像提供给网页
问题描述
所以我正在开发一个 Flask 应用程序,它几乎是一个属性管理器,允许用户上传他们的属性图像。我是 Flask 的新手,以前从未处理过图像。从大量谷歌搜索中,我了解到有多种方法可以管理图像等静态文件。
一种方法是允许用户将图像直接上传到文件系统,然后通过使用以下方式检索静态文件夹中的文件位置来显示它:
<img src="static/images/filename.jpg">
但是,这真的是一种有效的方法吗,因为这意味着在数据库中存储每个图像 URL 的生成和存储位置?尤其是在部署应用程序时?我发现的另一种方法是使用 base64 编码并将图像直接存储到数据库中,这听起来也不是很有效。
我认为最好的另一种方法是使用 AWS S3 存储桶。然后,用户将能够将图像直接上传到该存储桶并被分配到该图像的 URL。此 URL 存储在数据库中,然后可用于显示图像,类似于文件系统方法。我对此的理解正确吗?有没有更好的方法来解决这个问题?有没有类似于django-storages 的东西可以用来将 Flask 连接到 S3?
任何输入或指出我正确的方向将不胜感激。谢谢!
解决方案
如果您想将图像存储在 Web 服务器中,那么最好的方法是在烧瓶前使用 nginx 作为代理,让 nginx 为所有图像提供静态文件夹。
Nginx 对于一个小型网站来说已经足够了。不要尝试使用烧瓶提供文件。它太慢了。
如果要将图像存储在 s3 中,则只需将图像名称存储在数据库中的存储桶中。您可以告诉烧瓶使用 s3 存储桶作为静态文件夹。您可以在 python 中使用 boto3 库来访问 s3。 https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html
如果您担心将 s3 存储桶暴露给用户,那么您可以使用云端分发。它的服务价格更便宜,而且还隐藏了你的水桶。
推荐阅读
- javascript - TypeError:无法读取 cc.resources 中未定义的属性“加载”
- java - 在运行时为接口创建 bean 实例
- bitmap - 如何仅从像素数据 + 宽度 + 高度创建 MTLTexture
- kubernetes - Kubernetes:定义来自不同节点的卷挂载
- java - 如何为角色扮演游戏创建上下文无关语法
- ios - Flutter iOS App sqflite 数据库数据在应用升级后丢失
- angular - 升级到 Angular 9 和 10 后,Angular 开发环境无法按预期工作
- php - 多个 else if 在 jQuery
- windows - UseDefaultcredentials 不适用于 Invoke-RestMethod
- python - 将 Json 文件转换为数据帧