Flask——下载文件接口

7 篇文章 0 订阅
7 篇文章 0 订阅
本文档介绍了如何使用Python的Flask框架开发一个接口,该接口能够根据前端传入的ID,从数据库中获取数据,生成Excel文件,下载图片和视频文件,然后将所有文件打包成zip供前端下载。主要步骤包括创建服务器文件夹、生成Excel、下载图片和视频、打包zip以及返回给前端。
摘要由CSDN通过智能技术生成

业务背景

  • 近期用Python-Flask开发项目遇到一个多文件打包下载的业务接口,文件格式有Excel、图片文件、视频文件打包成zip下载。
  • 前端通过接口发送ID,后端通过ID查询数据库相关数据并生成Excel文档数据库查出图片和视频地址之后下载到服务器、打包成压缩包返回给前端。

实现思路

  1. 后端根据ID创建文件夹到服务器目录
  2. 查找数据库数据生成Excel文件,并存储到第一步生成的文件夹内
  3. 根据数据库查找到的文件(图片、视频)URL地址下载文件,并存储到第一步生成的文件夹内
  4. 将文件夹打包zip
  5. 返回给前端

项目代码

  • 项目基于Flask
  • 篇幅原因只贴出本下载接口业务相关代码
# 添加下载API接口
# Download
api.add_resource(Download, "/activities/download/<int:activities_id>")
  • 模型类:
# coding: utf-8
# extensions 为自定义模块
from extensions import db
import datetime

class Activities(db.Model):
    """
    活动
    """
    __tablename__ = 'activities'
    id = db.Column(db.Integer, primary_key=True)
    # 活动名称
    active = db.Column(db.String(64))
    # 活动类型
    active_type = db.Column(db.String(64))
    # 活动持续时间
    active_time = db.Column(db.Integer)
    # 活动对象
    active_object = db.Column(db.String(164))
    # 描述
    description = db.Column(db.String(164))
    # 图片 数据库存储格式为: ["url","url"]
    image = db.Column(db.String(1024))
    # 视频 数据库存储格式为: ["url","url"]
    video = db.Column(db.String(1024))

    # 创意
    idea_name = db.Column(db.String(164))
    # 学习
    learn_name = db.Column(db.String(164))
    # learn_id
    learn_id = db.Column(db.String(164))

    # 创建时间
    create_time = db.Column(db.DateTime, default=datetime.datetime.now)
    # 修改时间
    update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
    # is_del
    is_delete = db.Column(db.Integer, default=0)
    # 状态
    status = db.Column(db.Integer, default=0)
  • 核心代码:
from flask import make_response, send_from_directory
import os, zipfile, re, xlsxwriter, requests
# PS 数据库使用SQLAlchemy 导入自己的模型类
from models import Activities

class Download(Resource):
    def get(self, activities_id):
        # 1. 在项目目录内创建static文件夹
        path=os.path.abspath(os.path.dirname(os.path.dirname(__file__)))+"/static/"
        fileDownloadPath = path.replace('\\', '/')
        filePath = fileDownloadPath+ str(activities_id)+"/"
        if os.path.exists(filePath):
            shutil.rmtree(filePath)
        os.makedirs(filePath)
        
        #  2.数据库查找出数据存入excel
        object = Activities.query.filter(and_(Activities.id == activities_id, Activities.is_delete != 1)).first()
        # 自定义存储方法
        create_workbook(object, filePath+"Active.xlsx")
        
        # 3. 存储图片 存储视频
        if object.image is not None:
            imageUrl = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', str(object.image))
            if imageUrl is not None:
                for data in imageUrl:
                	# 自定义文件下载方法
                    getFile(filePath, data, "Image"+str(imageUrl.index(data)))
        if object.video is not None:
            videoUrl = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', str(object.video))
            if videoUrl is not None:
                for data in videoUrl:
                	# 自定义文件下载方法
                    getFile(filePath, data, "Video" + str(videoUrl.index(data)))
                    
        # 4. 自定义打包方法
        make_zip(filePath, fileDownloadPath+str(activities_id)+".zip")
        
        # 5. 返回zip
        response = make_response(
            send_from_directory(fileDownloadPath, str(activities_id)+".zip", as_attachment=True))
        return response

# 生成Excel
def create_workbook(object, filePath):
    # 创建Excel文件,不保存,直接输出
    workbook = xlsxwriter.Workbook(filePath)
    worksheet = workbook.add_worksheet("sheet")
    title = ["Activity Types", "Activity Details", "Duration Hours", "With Whom",  "Description", "Learnings", "Ideas"]
    worksheet.write_row('A1', title)
    worksheet.write_row('A2', [str(object.active),
                               str(object.active_type),
                               str(object.active_time),
                               str(object.active_object),
                               str(object.description),
                               str(object.learn_name),
                               str(object.idea_name)
                               ])
    workbook.close()

# 下载文件
def getFile(filePath, url, fileName):
    response = requests.get(url).content
    with open(filePath+fileName+url[-4:], 'wb') as f:
        f.write(response)
    print ("Sucessful to download "+fileName)

# 打包zip
def make_zip(filePath, source_dir):
  zipf = zipfile.ZipFile(source_dir, 'w')
  pre_len = len(os.path.dirname(filePath))
  for parent, dirnames, filenames in os.walk(filePath):
    for filename in filenames:
      pathfile = os.path.join(parent, filename)
      arcname = pathfile[pre_len:].strip(os.path.sep)
      zipf.write(pathfile, arcname)
  zipf.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值