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