簡體   English   中英

有什么辦法可以使用python從zip內部提供用戶上傳的圖片?

[英]Any way to serve user uploaded images from inside zips with python?

因此,我正在建立一個站點,用戶可以在其中上傳圖像庫(每個畫廊通常有幾十個圖像),並且在上傳之前應將其壓縮為zip文件(由用戶)。 我注意到(至少在Linux上)如何單擊壓縮的文件夾並查看其中的圖像而不解壓縮它。 像這樣,解壓縮會占用大量CPU資源,是否可以使用python這樣從zipfile中提供圖像?

您可以使用zipfile模塊使用Python讀取zip文件的內容,該模塊可讓您即時解壓縮並提供文件。 這是否實際上是您要執行的另一個問題,因為正如您提到的,解壓縮文件比直接從文件系統提供文件要占用更多的CPU資源。

我猜想用戶正在以zip格式上傳文件,以便他們可以一次上傳多個圖像。 在這種情況下,最好將zip文件上傳后再解壓縮。 然后,您可以將文件解壓縮到一個位置,您可以使用Web服務器從該位置將文件作為靜態文件提供。

樣品申請

以下代碼顯示了Flask示例應用程序,該應用程序演示了如何直接從zip文件提供圖像。 它開了很多角,所以不要在生產應用程序中直接使用它!

要測試該應用程序,請安裝flask(可能安裝到virtualenv中)並運行代碼:

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

確保在與flask應用程序相同的目錄下具有一個名為galleries的目錄,並且在galleries目錄中具有幾個包含jpegs的.zip文件。

import os
import zipfile

from flask import Flask
from flask import Response

app = Flask(__name__)

gallery_path = 'galleries'

@app.route('/')
def index():
    html = '<a href="{0}">{0}</a>'
    gallery_zips = os.listdir(gallery_path)
    gallery_names = [os.path.splitext(zfile)[0] for zfile in gallery_zips]
    galleries = [html.format(gallery) for gallery in gallery_names]
    return '<br>'.join(galleries)


@app.route('/<gallery>')
def gallery(gallery):
    zip_path = os.path.join(gallery_path, gallery + '.zip')
    html = '<a href="{0}/{1}">{1}</a>'
    with zipfile.ZipFile(zip_path, 'r') as zfp:
        images = zfp.namelist()
        image_list = [html.format(gallery, image) for image in images]
        return '<br>'.join(image_list)


@app.route('/<gallery>/<path:image>')
def image(gallery, image):
    zip_path = os.path.join(gallery_path, gallery + '.zip')
    with zipfile.ZipFile(zip_path) as zfp:
        image_fp = zfp.open(image, 'r')
        return Response(image_fp, mimetype='image/jpeg')

if __name__ == '__main__':
    app.run(debug=True)

可能的改進

  • 設置過期和其他的東西,可能有助於在緩存中的圖像文件image功能
  • 使用解壓縮圖像的緩存
    • 提供圖片時,請先檢查圖片是否在緩存位置
    • 如果不是,則將其解壓縮到緩存位置
    • 然后使用send_file將文件提供給客戶端
  • 緩存每個zip文件中包含的文件列表
  • 如果圖像實際上不在zip文件中,則生成404!

結論

上面的代碼將起作用,尤其是在人流少的站點上時。 如果有人每天看幾張圖像,那您會沒事的。 如果您稍微優化上述代碼(過期,緩存),則仍可以處理更多流量。 但是,如果要獲得最佳性能,則需要尋找一種能夠在zip文件上傳后對其進行解壓縮並直接使用網絡服務器( nginxapache或使用的任何文件)對其進行壓縮的工具。 當您獲得來自世界各地的成千上萬的訪客時,您也可以開始查看內容交付網絡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM