iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

全端網頁-入職三十天學習筆記系列 第 11

【全端網頁開發】Day11-Flask實作提供下載圖片ZIP的API

  • 分享至 

  • xImage
  •  

前言

接下來會記錄一些,練習過程中實做的內容

實作提供下載圖片ZIP的API

1.先設定好本地圖片的目錄位置和回傳的ZIP檔名

2.使用 zipfile.ZipFile,創建了一個 ZIP 文件,並打開它以寫入模式
(會寫進設定好的zip_file_path)

3.使用 os.path.join() 函式組合 static_path 和 image_filename
,以獲取圖片文件的完整路徑

4.使用 os.path.exists() 檢查圖片文件是否存在
若圖片文件存在,則用zipf.write將該文件添加到 ZIP 文件中

5.最後return send_file ( zip_file_path ) 回傳ZIP檔給使用者
(as_attachment=True 表示文件視為附件,而不是在瀏覽器中顯示它)

from flask import Blueprint, request, send_file
import os
import zipfile

images = Blueprint('images', __name__)

@images.route('/download', methods=['GET'])
def download():

    # 設定靜態路徑目錄與檔案名稱
    static_path = 'static'
    image_filename = 'compal.jpg'

    # 創建壓縮文件
    zip_file_path = 'image.zip'
    
    with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_STORED) as zipf:
        # 獲取圖片文件的完整路徑
        file_path = os.path.join(static_path, image_filename)
        if os.path.exists(file_path):
            # 使用 arcname 參數指定文件名,不包含文件夾路徑
            zipf.write(file_path, arcname=image_filename)
        else:
            return '圖片文件不存在'

    # 返回zip
    return send_file(zip_file_path, as_attachment=True)

那實做後因為這種方式會在本地端留下檔案
因此也嘗試了另一種不在本地端留存zip檔案的方式

實作提供下載圖片ZIP的API(不在本地端留存zip檔案)

1.zip_buffer = io.BytesIO() 使用 BytesIO 創建一個 ZIP 內存數據

2.使用 zipfile.ZipFile 創建了一個 ZIP 文件,
將其存儲在 zip_buffer 中,因此 ZIP 數據將以二進制形式保存在內存中

  1. zip_buffer.seek(0) 將游標定位到 ZIP 數據的開頭

4.最後return加上donwload_name設定下載後名稱

from flask import Blueprint, request, send_file,render_template
import os,io,zipfile

images = Blueprint('images', __name__)

@images.route('/')
def images_page():
    return render_template('images.html')


@images.route('/dowload', methods=['GET'])
def dowload():

    # 設定靜態路徑目錄與檔案名稱
    static_path = 'static'
    image_filename = 'compal.jpg'

    # 創建壓縮文件
    zip_buffer = io.BytesIO()  # 使用 BytesIO 創建一個 ZIP 數據流
    with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_STORED) as zipf:
        # 獲取圖片文件的完整路徑
        file_path = os.path.join(static_path, image_filename)
        if os.path.exists(file_path):
            # 使用 arcname 參數指定文件名,不包含文件夾路徑
            zipf.write(file_path, arcname=image_filename)
        else:
            return '圖片文件不存在'

    # 將 ZIP 數據流轉換為 Response 物件,直接返回 ZIP 數據
    zip_buffer.seek(0)  # 將游標定位到 ZIP 數據的開頭
    return send_file(zip_buffer, as_attachment=True, download_name='image.zip')

上一篇
【全端網頁開發】Day10-flask-解決跨來源資源共用(CORS)
下一篇
【全端網頁開發】Day12-Flask實作使用者上傳文件回傳壓縮檔
系列文
全端網頁-入職三十天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言