前端写法
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
说点什么
欢迎讨论