
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()
