解压压缩包并放到指定路径

先取到上传过来的文件对象

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 "上传成功"

  

  

  

 

  

 

posted @ 2018-06-20 10:14  高~雅  阅读(2576)  评论(0编辑  收藏  举报