![](/img/trans.png)
[英]way to delete uploaded images entries from restAPI localhost server with python?
[英]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
功能 上面的代碼將起作用,尤其是在人流少的站點上時。 如果有人每天看幾張圖像,那您會沒事的。 如果您稍微優化上述代碼(過期,緩存),則仍可以處理更多流量。 但是,如果要獲得最佳性能,則需要尋找一種能夠在zip文件上傳后對其進行解壓縮並直接使用網絡服務器( nginx , apache或使用的任何文件)對其進行壓縮的工具。 當您獲得來自世界各地的成千上萬的訪客時,您也可以開始查看內容交付網絡 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.