django下载文件,从FTP获取文件
2019-03-06 本文已影响0人
不爱去冒险的少年y
环境:django+vue
一:从FTP下载文件:
原因:由于FTP需要登录无法从直接从FTP直接获取文件,
解决:通过后获取FTP文件,再通过文件流传输给前台
1:django后台:
class BatteryReportDownloadViewSet(APIView):
def post(self, request):
reports_down = reports.DownFTP() #连接FTP获取
report_url='FTP文件路径'
if report_url:
reports_name = os.path.split(report_url)[1]
local_url = `服务器存放文件路径`
if reports_down.ftpDownload(report_url, local_url): #将FTP下载到服务器
with open(local_url, 'rb') as model_excel:
result = model_excel.read()
response = HttpResponse(content=result, content_type="application/octet-stream", charset="utf-8") #将数据读取到内存中,如果文件太大,建议分批
response['Content-Disposition'] = 'attachment; filename='+reports_name # 自定义响应头 将文件名传输到前台
response['Access-Control-Expose-Headers'] = "Content-Disposition" # 通过此header允许前端访问 解决跨域后系统为了安全去掉自定义头
return response
class DownFTP(object):
def __init__(self):
"""
连接ftp
:return: ftp连接对象
"""
__host = "" # ftp地址
__username = "账号" # 禁止使用代码访问传输
__password = "密码#" # 禁止使用代码访问传输
self.ftp = ftplib.FTP()
self.ftp.connect(__host, 21)
self.ftp.login(__username, __password)
def ftpDownload(self, remoteDown_url, local_url):
"""
下载ftp文件
:param template_file: 单个模板文件的名字
:return: True
"""
remoteDown_url = remoteDown_url.replace('℃', 'D')
try:
self.ftp.cwd(os.path.split(remoteDown_url)[0]) # 打开远程路径
self.judgePath(os.path.split(local_url)[0])
with open(local_url, 'wb') as fp: # 本地创建文件,获得文件对象
self.ftp.retrbinary("RETR " + os.path.split(remoteDown_url)[1], fp.write,
1024) # 下载远程ftp服务器的文件, 以1024kb进行下载
self.ftp.set_debuglevel(0)
except Exception as error:
logger_utils.error(error)
return False
self.ftp.close()
return True
2.VUE前台
// 下载文件
downloadReport(e) {
this.$axios({
method: "post",
url: this.$path + "tests/batteryReportDownload/",
responseType: "blob", #Blob对象表示一个不可变的, 原始数据的类似文件对象
data: {
}
}).then(res => {
if (res.data.size > 500) {
let headers = res.headers;
let fileName = headers["content-disposition"]; #获取传过来的自定义Header
let title = fileName.match("filename=")
? fileName.split("=")[1] #截取文件名
: "下载的表单文件";
let url = window.URL.createObjectURL(res.data);
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.download = title;
document.body.appendChild(link);
link.click();
URL.revokeObjectURL(link.href);
document.body.removeChild(link);
} else {
this.$message.error(
"报告文件数据为空,可能是数据传输出现问题,请检查网络问题!"
);
}
});
},