解壓壓縮包並放到指定路徑


先取到上傳過來的文件對象

if request.method == "GET":
    return render_template('upload.html')
from werkzeug.datastructures import FileStorage
file_obj = request.files.get('code') 

1、我們只接收zip壓縮包。

name_ext = file_obj.filename.rsplit('.',maxsplit=1)
if len(name_ext) != 2:
    return "請上傳zip壓縮文件"
if name_ext[1] != 'zip':
    return "請上傳zip壓縮文件"

2. 接收用戶上傳文件,並寫入到服務器本地。

file_path = os.path.join("files",file_obj.filename)
    # 從file_obj.stream中讀取內容,寫入到文件
file_obj.save(file_path)

3. 解壓zip文件。

import shutil
    # 通過open打開壓縮文件,讀取內容再進行解壓。
shutil._unpack_zipfile(file_path,'xsadfasdfasdf')  

結果我們發現這樣的話我們接收一遍上傳過來的壓縮包,又保存一份解壓過的文件夾,太占內存,我們可以先接收上傳過來的壓縮包,然后進行解壓,最后保存到指定路徑。更省事。

# 2+3, 接收用戶上傳文件,並解壓到指定目錄
import shutil
target_path = os.path.join('files',str(uuid.uuid4()))  #為了防止重名,文件覆蓋,設置隨機字符串
shutil._unpack_zipfile(file_obj.stream,target_path)   #解壓文件

4. 遍歷某目錄下的所有文件。

# 4、遍歷目錄下的所有文件
    total_num=0
    for base_path,folder_list,file_list in os.walk(target_path):
        for file_name in file_list:
            file_path=os.path.join(base_path,file_name)
            file_ext=file_path.rsplit(".",maxsplit=1)
            if len(file_ext)!=2:
                continue
            if file_ext[1]!="py":
                continue
            file_num=0
            with open(file_path,"rb") as f:
                for line in f:
                    line=line.strip()
                    if not line:  #空行
                        continue
                    if line.startswith(b"#"):
                        continue
                    file_num+=1
            total_num+=file_num

    #獲取當前時間
    import datetime
    ctime=datetime.date.today()
    print(total_num,ctime,session["user_info"]["user_id"])

    data=helper.fetch_one("select id from coderecord where date=%s and uid=%s",(ctime,session['user_info']['user_id']))
    print(data)
    if data:
        return "今天已經上傳"

    helper.insert("insert into coderecord(row,date,uid)values(%s,%s,%s)",
                  (total_num, ctime, session['user_info']['user_id']))

    return "上傳成功"

總體代碼

def upload():
    if request.method=="GET":
        return render_template("upload.html")

    file_obj=request.files.get("upload_file")
    #1、檢查上傳文件后綴名
    next_ext=file_obj.filename.rsplit(".",maxsplit=1)
    if len(next_ext)!=2:
        return "請上傳zip壓縮文件"
    if next_ext[1]!="zip":
        return "請上傳zip文件"
    #2、接收用戶上傳文件,並解壓到指定目錄
    target_path=os.path.join("upload_files",str(uuid.uuid4())) #防止重名,設置隨機字符串
    shutil._unpack_zipfile(file_obj.stream,target_path) #壓縮文件
    # 4、遍歷目錄下的所有文件
    total_num=0
    for base_path,folder_list,file_list in os.walk(target_path):
        for file_name in file_list:
            file_path=os.path.join(base_path,file_name)
            file_ext=file_path.rsplit(".",maxsplit=1)
            if len(file_ext)!=2:  #沒有后綴
                continue
            if file_ext[1]!="py":  #py文件
                continue
            file_num=0
            with open(file_path,"rb") as f:
                for line in f:
                    line=line.strip()
                    if not line:  #空行
                        continue
                    if line.startswith(b"#"): #注釋
                        continue
                    file_num+=1
            total_num+=file_num

    #獲取當前時間
    import datetime
    ctime=datetime.date.today()
    print(total_num,ctime,session["user_info"]["user_id"])

    data=helper.fetch_one("select id from coderecord where date=%s and uid=%s",(ctime,session['user_info']['user_id']))
    print(data)
    if data:
        return "今天已經上傳"

    helper.insert("insert into coderecord(row,date,uid)values(%s,%s,%s)",  #數據庫插入數據
                  (total_num, ctime, session['user_info']['user_id']))

    return "上傳成功"

  

  

  

 

  

 


免責聲明!

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



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