文件操作接口

基于FastAPI框架的文件上传服务。主要功能包括:

  • 初始化日志:通过logging模块配置日志输出文件、日志级别和格式。
  • 定义全局变量:获取脚本所在目录和项目目录,定义上传文件的保存目录。
  • 创建FastAPI应用:实例化FastAPI对象,用于构建API接口。
  • 文件上传接口:通过app.post装饰器定义一个上传文件的接口。接口接收一个UploadFile类型的参数file,表示上传的文件。接口的主要逻辑包括:
  • 验证文件格式是否符合要求(只接受.xlsx文件)。
  • 读取文件的二进制内容。
  • 调用save_upload_file函数保存文件,并根据保存结果返回相应的响应。
  • 文件保存函数:save_upload_file函数用于保存上传的文件。主要逻辑包括:
  • 确保上传目录存在,如果不存在则创建。
  • 生成唯一的文件名,格式为时间戳.xlsx。
  • 将文件内容写入到指定路径。
  • 返回文件的名称、路径和大小,如果保存失败则返回None。、
  • 启动服务:根据运行模式(线上模式或调试模式),使用uvicorn模块启动FastAPI应用

在FastAPI中,FileUploadFile是处理文件上传的两个关键组件,它们允许你在API端点中接收和处理用户上传的文件。下面是这两个类的简要解释:

File

File是FastAPI的一个依赖项,它本身不是一个具体的类,而是一个类型注解,用来声明一个参数应该接收一个上传的文件。它通常与UploadFile一起使用,后者才是实际处理文件上传的类。使用File时,你可以指定一些额外的参数来约束上传的文件,比如文件的大小限制。但是,直接使用File的情况较少,更多时候是通过UploadFile间接使用。

UploadFile

UploadFile是FastAPI提供的一个类,它实现了异步操作,用于处理上传的文件。当用户通过HTTP请求上传文件时,FastAPI会自动将上传的文件包装成UploadFile对象。这个对象提供了文件操作的异步方法,如读取文件内容、获取文件名、获取文件类型等。例如,你可以使用await upload_file.read()来读取文件的二进制内容,这对于处理大文件特别有用,因为它支持流式读取,不会一次性加载整个文件到内存中。

import logging
import os
from datetime import datetime
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse, FileResponse
import uvicorn


# 初始化日志
logging.basicConfig(filename='file_server.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

script_dir = os.path.dirname(os.path.abspath(__file__))
pro_dir = os.path.abspath(os.path.join(script_dir, '..'))
dir_upload = os.path.abspath(os.path.join(pro_dir, 'files'))

app = FastAPI()


@app.post("/upload_file/")
async def upload_file(file: UploadFile = File(...)):
    """
    接收上传的文件,保存到服务器,并返回文件信息。
    """
    # 验证文件格式
    if file.content_type != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
        raise HTTPException(status_code=400, detail="上传文件格式不符合要求")
        return {
            "message": "文件格式错误"
        }

    try:
        # 读取文件的二进制内容
        file_content = await file.read()

        # 调用save_upload_file函数保存文件
        file_info = await save_upload_file(dir_upload, file_content)
        if file_info is not None:
            # 如果文件保存成功,则返回文件信息
            return JSONResponse(content=file_info)
        else:
            # 文件保存失败,返回错误信息
            return JSONResponse(content={"message": "File save fail"},
                                status_code=500)
    except Exception as e:
        logger.error("Error file upload: %s", str(e))
        return JSONResponse(content={"message": "File uploaded fail"},
                            status_code=500)


# 定义并实现文件保存函数
async def save_upload_file(dir_upload, file_content) -> dict:
    try:
        # 确保上传目录存在
        if not os.path.exists(dir_upload):
            os.makedirs(dir_upload)

        # 使用当前时间戳生成文件名
        timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
        file_name = f"{timestamp}.xlsx"
        file_path = os.path.join(dir_upload, file_name)

        # 保存文件到指定路径
        with open(file_path, "wb") as f:
            f.write(file_content)
        file_size = os.path.getsize(file_path)

        return {
            "file_name": file_name,
            "file_path": file_path,
            "file_size": file_size
        }
    except Exception as e:
        logger.error("File save fail: %s", str(e))
        return None


## 文件下载
@app.get("/get_file/", summary="get file", tags=['文件'])
async def get_file(file_name: str):

    """
    根据文件名提供文件的 HTTP 服务
    """
    try:
        file_path = os.path.join(dir_upload, file_name)
        print("file_path", file_path)
        if not os.path.exists(file_path):
            return {
                "status": 0,
                "message": "File not found"
            }
        return FileResponse(file_path, media_type="application/octet-stream", filename=file_name)
    except Exception as e:
        return {
            "status": 0,
            "message": str(e)
        }


if __name__ == "__main__":
    ## 线上模式
    # uvicorn.run("sms_server:app", host="0.0.0.0", port=1315)

    ## debug 模式
    uvicorn.run("file_server:app", host="0.0.0.0", port=1316, reload=True, )

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值