Flask保存或解壓上傳的文件


import os
import uuid
import shutil
import zipfile
from flask import Flask, render_template, request
# from werkzeug.datastructures import FileStorage

app = Flask(__name__)

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

def unzip_file(zip_src, dst_dir):
    """
    解壓zip文件
    :param zip_src: zip文件的全路徑
    :param dst_dir: 要解壓到的目的文件夾
    :return:
    """
    r = zipfile.is_zipfile(zip_src)
    if r:
        fz = zipfile.ZipFile(zip_src, "r")
        for file in fz.namelist():
            fz.extract(file, dst_dir)
    else:
        return "請上傳zip類型壓縮文件"
    
@app.route("/upload", methods=["GET", "POST"])
def upload():
    if request.method == "GET":
        return render_template("upload.html")
    obj = request.files.get("file")
    print(obj)  # <FileStorage: "test.zip" ("application/x-zip-compressed")>
    print(obj.filename)  # test.zip
    print(obj.stream)  # <tempfile.SpooledTemporaryFile object at 0x0000000004135160>
    # 檢查上傳文件的后綴名是否為zip
    ret_list = obj.filename.rsplit(".", maxsplit=1)
    if len(ret_list) != 2:
        return "請上傳zip類型壓縮文件"
    if ret_list[1] != "zip":
        return "請上傳zip類型壓縮文件"

    # 方式一:直接保存文件
    obj.save(os.path.join(BASE_DIR, "files", obj.filename))

    # 方式二:保存解壓后的文件(原壓縮文件不保存)
    target_path = os.path.join(BASE_DIR, "files", str(uuid.uuid4()))
    shutil._unpack_zipfile(obj.stream, target_path)

    # 方式三:先保存壓縮文件到本地,再對其進行解壓,然后刪除壓縮文件
    file_path = os.path.join(BASE_DIR, "files", obj.filename)  # 上傳的文件保存到的路徑
    obj.save(file_path)
    target_path = os.path.join(BASE_DIR, "files", str(uuid.uuid4()))  # 解壓后的文件保存到的路徑
    ret = unzip_file(file_path, target_path)
    os.remove(file_path)  # 刪除文件
    if ret:
        return ret
    
    return "上傳成功"

if __name__ == "__main__":
    app.run()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM