有没有办法用python从zips内部为用户上传的图片提供服务?

2024-06-16 12:40:01 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我做了一个网站,用户可以上传图片库(通常每个图库有几十张图片),在上传之前,它们应该被压缩成一个zip文件(由用户)。我注意到(至少在Linux上)我可以点击一个压缩文件夹,查看其中的图像而不必提取它。有没有可能像这样使用python从zipfiles内部提供图像,因为解压缩是CPU密集型的?在


Tags: 文件用户图像文件夹网站linux图片cpu
1条回答
网友
1楼 · 发布于 2024-06-16 12:40:01

您可以使用Python使用zipfile模块读取zip文件的内容,该模块允许您动态解压缩和服务文件。这是否是您真正想要做的是另一个问题,因为正如您所提到的,解压文件将比直接从文件系统提供文件更占用CPU资源。在

我猜用户上传的是一个压缩文件,这样他们就可以一次上传多个图片了。在这种情况下,最好是在zip文件上传后解压缩它。然后,您可以将文件解压缩到一个可以使用web服务器将文件作为静态文件提供的位置。在

示例应用程序

下面的代码展示了一个示例Flask应用程序,它演示了如何直接从zip文件提供图像。它削减了很多角落,所以不要直接在生产应用程序中使用它!在

要测试应用程序,请安装flask(可能安装到virtualenv中)并运行代码:

virtualenv env
env/bin/pip install flask
env/bin/python sample_flask_application.py

确保您有一个名为galleries的目录与flask应用程序处于同一级别,并且在galleries目录中有几个.zip包含JPEG的文件。在

^{pr2}$

可能的改进

  • 设置expires和其他可能有助于在image函数中缓存图像文件的内容
  • 使用解压缩图像的缓存
    • 提供图像时,首先检查图像是否在缓存位置
    • 否则,将其解压缩到缓存位置
    • 然后使用send_file将文件提供给客户端
  • 缓存每个zipfile中包含的文件列表
  • 如果图像实际上不在zip文件中,则生成404!在

结论

上面的代码可以工作,特别是当你在一个低流量的网站。如果有几个人每天看几张照片,你就没事了。如果你优化上面的代码一点(过期,缓存),那么你仍然可以处理更多的流量。然而,如果你想要最好的性能,那么你需要的是在上传zip文件时解压,并直接使用web服务器(nginxapache,或任何你正在使用的东西)来提供这些文件。当你有成千上万的来自世界各地的游客时,你也可以开始看content delivery networks。在

相关问题 更多 >