解压压缩包并放到指定路径
先取到上传过来的文件对象
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 "上传成功"

浙公网安备 33010602011771号