django下载文件,从FTP获取文件

环境: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(
            "报告文件数据为空,可能是数据传输出现问题,请检查网络问题!"
          );
        }
      });
    },

你可能感兴趣的:(django下载文件,从FTP获取文件)