Django中实现文件下载(文件夹自动zip压缩)

前端写法

var url = "/api/other/get_single_file/?ci={0}&uri={1}&is_dir={2}".format(*,*,*);
// 获取后端返回后:
window.open(file_url);

// 获取后端返回后:
window.open(file_url);

后端写法

后端使用pysftp模块实现连接指定机器并下载或上传文件。

建立连接:

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
srv = pysftp.Connection(host=ip, username=username,password=password, cnopts=cnopts)

具体逻辑:

# 如果是文件夹,则为get_d
if is_dir == "1":
    print("----")
    print(uri[1:])
    put_dir = get_or_create_user_dir(login_user, uri, is_dir)
    a = srv.get_d(uri[1:], put_dir, preserve_mtime=True)
    # 若为文件夹,则在该目录下压缩为zip
    the_file_name = put_dir + "/" + uri.split("/")[-1] + ".zip"
    zip_dir(put_dir, the_file_name)
else:
    put_dir = get_or_create_user_dir(login_user, uri, is_dir)
    a = srv.get(uri[1:], get_or_create_user_dir(login_user, uri, is_dir), preserve_mtime=True)
    the_file_name = put_dir
response = StreamingHttpResponse(file_iterator(the_file_name))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name.split("tmp/")[1])
return response



获取或创建文件:

def get_or_create_user_dir(login_user, uri, is_dir):
 base_dir = '/opt/xys/qate/file_tree/tmp/' + login_user
 # 如果是文件夹,则先新建该文件夹,然后返回该文件夹路径
 if get_or_create_dir(base_dir):
 if is_dir == "1":
 base_dir += "/" + uri.split("/")[-1]
 if get_or_create_dir(base_dir):
 return base_dir
 else:
 # 如果是文件,则直接在该用户目录下返回文件路径
 return base_dir + "/" + uri.split("/")[-1]

# 如果是文件夹,则压缩文件
def zip_dir(dir_name, zip_file_name):
    file_list = []
    if os.path.isfile(dir_name):
        file_list.append(dir_name)
    else:
        for root, dirs, files in os.walk(dir_name):
            for name in files:
                file_list.append(os.path.join(root, name))
    zf = zipfile.ZipFile(zip_file_name, "w", zipfile.zlib.DEFLATED)
    for tar in file_list:
        arc_name = tar[len(dir_name):]
        zf.write(tar, arc_name)
    zf.close()


def get_or_create_dir(path):
    if os.path.exists(path):
        return True
    else:
        os.makedirs(path)
        return True


def file_iterator(file_name, chunk_size=2048):
    with open(file_name) as f:
        while True:
            c = f.read(chunk_size)
            if c:
                yield c
            else:
                break

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒