先取到上傳過來的文件對象
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 "上傳成功"