5分钟做一个Python fastapi 图片和文件视频的服务

摘要

Python fastapi 做一个图片和文件视频的服务,以下是一个使用 FastAPI 构建的简单图片、文件和视频服务的示例代码。该服务允许你上传文件,并提供文件下载的接口。fastapi-file-serviceFastAPI 图片和文件视频服务代码V1生成 file_service.py。

fastapi-file-serviceFastAPI

图片和文件视频服务代码

V1

 file_service.py

import os
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import FileResponse

app = FastAPI()

# 定义存储文件的目录
UPLOAD_DIR = "uploads"
if not os.path.exists(UPLOAD_DIR):
    os.makedirs(UPLOAD_DIR)


@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    try:
        file_path = os.path.join(UPLOAD_DIR, file.filename)
        with open(file_path, "wb") as f:
            contents = await file.read()
            f.write(contents)
        return {"filename": file.filename, "message": "文件上传成功"}
    except Exception as e:
        return {"message": f"文件上传失败: {str(e)}"}


@app.get("/download/{filename}")
async def download_file(filename: str):
    file_path = os.path.join(UPLOAD_DIR, filename)
    if os.path.exists(file_path):
        return FileResponse(file_path)
    return {"message": "文件未找到"}

    

代码解释

  1. 导入必要的库:导入 FastAPIFileUploadFile 和 FileResponse 这些 FastAPI 相关的类。
  2. 创建 FastAPI 应用app = FastAPI() 创建了一个 FastAPI 应用实例。
  3. 创建存储目录:检查 uploads 目录是否存在,如果不存在则创建它。
  4. 文件上传接口/upload/ 接口接收一个文件,将其保存到 uploads 目录中。
  5. 文件下载接口/download/{filename} 接口根据文件名从 uploads 目录中查找文件,如果存在则返回文件响应。

运行步骤

  1. 保存上述代码为 file_service.py
  2. 打开终端,进入代码所在目录。
  3. 运行以下命令启动 FastAPI 服务:

bash

uvicorn file_service:app --reload

  1. 你可以使用工具(如 Postman)向 http://localhost:8000/upload/ 发送文件进行上传,向 http://localhost:8000/download/{filename} 发送请求进行文件下载。

显示和视频播放的 API.

在之前的代码基础上添加显示图片和播放视频的 API。这里我们使用 StreamingResponse 来流式传输图片和视频数据。

fastapi-file-serviceFastAPI 图片和文件视频服务代码

V2

 file_service.py

import os
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import FileResponse, StreamingResponse

app = FastAPI()

# 定义存储文件的目录
UPLOAD_DIR = "uploads"
if not os.path.exists(UPLOAD_DIR):
    os.makedirs(UPLOAD_DIR)


@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    try:
        file_path = os.path.join(UPLOAD_DIR, file.filename)
        with open(file_path, "wb") as f:
            contents = await file.read()
            f.write(contents)
        return {"filename": file.filename, "message": "文件上传成功"}
    except Exception as e:
        return {"message": f"文件上传失败: {str(e)}"}


@app.get("/download/{filename}")
async def download_file(filename: str):
    file_path = os.path.join(UPLOAD_DIR, filename)
    if os.path.exists(file_path):
        return FileResponse(file_path)
    return {"message": "文件未找到"}


@app.get("/display_image/{filename}")
async def display_image(filename: str):
    file_path = os.path.join(UPLOAD_DIR, filename)
    if os.path.exists(file_path):
        def iterfile():
            with open(file_path, mode="rb") as file_like:
                yield from file_like
        return StreamingResponse(iterfile(), media_type="image/jpeg")
    return {"message": "图片未找到"}


@app.get("/play_video/{filename}")
async def play_video(filename: str):
    file_path = os.path.join(UPLOAD_DIR, filename)
    if os.path.exists(file_path):
        def iterfile():
            with open(file_path, mode="rb") as file_like:
                yield from file_like
        return StreamingResponse(iterfile(), media_type="video/mp4")
    return {"message": "视频未找到"}
    

代码解释

  1. 导入 StreamingResponse:用于流式传输文件内容。
  2. 显示图片 API/display_image/{filename} 接口接收图片文件名,若文件存在则以流式传输的方式返回图片数据,媒体类型为 image/jpeg
  3. 播放视频 API/play_video/{filename} 接口接收视频文件名,若文件存在则以流式传输的方式返回视频数据,媒体类型为 video/mp4

注意事项

  • 这里假设图片格式为 JPEG,视频格式为 MP4,你可以根据实际情况修改 media_type
  • 确保上传的文件存储在 uploads 目录下。

运行步骤与之前相同,启动服务后,你可以通过相应的 API 来显示图片和播放视频。

能否用URL call

当然可以,为了让你可以通过 URL 调用这些接口,我们可以使用 Python 的 requests 库来发送 HTTP 请求,以下是示例代码:

若要访问之前构建的 FastAPI 服务中的各个接口,可通过不同途径达成,以下为你详细介绍:

1. 使用浏览器访问

  • 显示图片
    当你要显示上传的图片时,可在浏览器地址栏输入类似如下的 URL:

    plaintext

    http://localhost:8000/display_image/your_image.jpg
    

    把 your_image.jpg 替换成你实际上传的图片文件名。若图片存在,浏览器会直接展示该图片。
  • 播放视频
    若要播放上传的视频,在浏览器地址栏输入如下 URL:

    plaintext

    http://localhost:8000/play_video/your_video.mp4
    

    把 your_video.mp4 替换成你实际上传的视频文件名。部分浏览器可直接播放视频,有些则可能需要你手动下载后再用视频播放器播放。

2. 使用命令行工具(如 curl)访问

  • 上传文件
    借助 curl 命令上传文件,示例如下:

    bash

    curl -X POST "http://localhost:8000/upload/" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@your_file.jpg"
    

    这里的 your_file.jpg 要替换成你实际要上传的文件名。
  • 下载文件
    运用 curl 命令下载文件,示例如下:

    bash

    curl -o downloaded_file.jpg "http://localhost:8000/download/your_file.jpg"
    

    把 your_file.jpg 替换成你要下载的文件名,downloaded_file.jpg 是下载后保存的文件名,可按需修改。
  • 显示图片
    若要显示图片,可使用以下命令:

    bash

    curl -o displayed_image.jpg "http://localhost:8000/display_image/your_image.jpg"
    

    把 your_image.jpg 替换成实际的图片文件名,displayed_image.jpg 是保存图片的文件名。
  • 播放视频
    若要获取视频,可使用以下命令:

    bash

    curl -o played_video.mp4 "http://localhost:8000/play_video/your_video.mp4"
    


    把 your_video.mp4 替换成实际的视频文件名,played_video.mp4 是保存视频的文件名。

3. 使用 Python 的 requests 库访问

你可以参考之前提供的使用 requests 库的代码示例,修改相应的文件名和 URL 地址,运行 Python 脚本来访问各个接口。

注意事项

  • 要保证你的 FastAPI 服务已经启动,并且运行在 http://localhost:8000 上。如果服务运行在其他地址或端口,需相应修改上述 URL 中的地址和端口信息。
  • 对于文件上传和下载,要确保文件路径和文件名准确无误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值