自学内容网 自学内容网

文件图片等数据的上传服务和下载服务实现

如何实现文件数据的上传服务和下载服务

目录

  1. 引言
  2. 文件上传服务
  3. 文件下载服务
  4. 总结
  5. 参考资料

引言

在现代应用中,文件上传和下载是非常常见的需求。无论是用户上传图片、文档,还是下载报告、数据文件,良好的文件管理服务都是必不可少的。本文将详细介绍如何实现一个简单的文件上传和下载服务,使用Python的FastAPI框架和Nginx作为反向代理服务器。

文件上传服务

2.1 上传服务概述

文件上传服务允许用户将文件上传到服务器,并将其存储在指定的路径中。我们将使用FastAPI框架来实现这个服务。FastAPI是一个现代的、快速的(高性能)Web框架,适合构建API。

2.2 上传服务的实现

2.2.1 环境准备

在开始之前,确保你已经安装了以下软件:

  • Python 3.7+
  • FastAPI
  • Uvicorn(用于运行FastAPI应用)
  • Nginx(用于反向代理)

可以使用以下命令安装FastAPI和Uvicorn:

pip install fastapi uvicorn
2.2.2 代码实现

以下是实现文件上传服务的代码示例。我们将创建一个名为file_writer_server.py的Python文件。

# -*- encoding: utf-8 -*-
"""
@File    :   file_writer_server.py
@Description    :   文件上传服务
@Author    :   一只特立独行的羱
@License :   (C)Copyright 2019-2030,xx
"""

import os
import sys
import uvicorn
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from fastapi import FastAPI, UploadFile, File, Form

# api对象
app = FastAPI()

# 添加CORS中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 允许所有源
    allow_credentials=True,
    allow_methods=["*"],  # 允许所有方法
    allow_headers=["*"],  # 允许所有头
)

import argparse

# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='这是一个接收文件并存储的服务,请带根路径参数运行!')

# 添加参数
parser.add_argument('--root_path', type=str, default='/data/extdocker/nginx/upload/', help='存储目录的根路径')

# 解析参数
args = parser.parse_args()

root_path = args.root_path

if not os.path.exists(root_path):
    raise AssertionError(f'{root_path},该路径不存在,请带入正确的存储目录的根路径。')
else:
    print(f'root path:{root_path}')

@app.post("/upload")
async def upload_file_and_write(file: UploadFile = File(...),
                                relative_path: str = Form(None, description="要存储的相对路径")):
    # relative_path必须是相对路径
    if relative_path.startswith(os.sep):
        relative_path = relative_path[1:]
    try:
        # 确保上传目录存在
        upload_dir = os.path.join(root_path, relative_path)

        if not os.path.exists(upload_dir):
            os.makedirs(upload_dir)

        # 生成文件路径
        file_path = os.path.join(upload_dir, file.filename)
        print(f"current file path to write: {file_path}")
        # 将文件内容写入磁盘
        with open(file_path, "wb") as buffer:
            buffer.write(await file.read())
            print(f"file {file_path} is written.")
        return JSONResponse(content={"filename": os.path.relpath(file_path, root_path), "message": "文件上传成功"}, status_code=200)
    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)

if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=9098, workers=1)
代码解析
  1. 导入库:我们导入了 FastAPI、Uvicorn、JSONResponse 和 CORS 中间件等必要的库。
  2. 创建 FastAPI 应用:通过 FastAPI() 创建一个应用实例。
  3. CORS 中间件:允许所有源进行跨域请求,方便前端与后端的交互。
  4. 命令行参数:使用 argparse 来获取存储文件的根路径。
  5. 上传接口:定义了一个 POST 接口 /upload,用于接收文件和相对路径参数。
  6. 文件存储逻辑
    • 检查并创建上传目录。
    • 将上传的文件写入指定路径。
    • 返回上传成功的响应。
2.2.3 启动服务

在终端中运行以下命令以启动服务:

python file_writer_server.py --root_path /data/extdocker/nginx/upload/

此时,服务将监听9098端口,等待文件上传请求。

2.3 上传服务的测试

可以使用Postman或cURL工具测试上传服务。以下是使用cURL的示例命令:

curl -X POST "http://<替换为你的IP>:9098/upload" -F "file=@/path/to/your/file.jpg" -F "relative_path=daipd/pest/"

如果上传成功,将返回一个JSON响应,包含文件名和成功消息。

文件下载服务

3.1 下载服务概述

文件下载服务允许用户从服务器下载存储的文件。我们将使用Nginx作为反向代理服务器来处理下载请求。

3.2 下载服务的实现

3.2.1 Nginx配置

为了能够通过 HTTP 访问上传的文件,我们需要配置 Nginx。以下是 Nginx 的配置文件示例:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    client_max_body_size 100M;

    include /etc/nginx/conf.d/*.conf;
    
    server {
        listen 80;
        server_name 0.0.0.0 localhost 127.0.0.1;

        location /upload {
            add_header 'Access-Control-Allow-Origin' '*';
            alias /data/extdocker/nginx/upload/;  # 修改为实际的上传目录
            index index.html;
            charset utf-8;  # 设置字符集
        }
    }
}

Nginx 配置文件解析

  1. 基本配置:设置用户、工作进程和错误日志等基本信息。
  2. HTTP 配置:包括 MIME 类型、日志格式、文件传输设置等。
  3. server 块:监听 80 端口,配置上传文件的访问路径。
  4. location 块:配置 /upload 路径的访问,允许跨域请求,并指定文件存储的实际路径。

配置完成后,重启Nginx以使更改生效:

sudo systemctl restart nginx
3.2.2 下载服务的代码实现

下载服务不需要额外的代码实现,因为Nginx将处理文件的下载请求。用户只需通过HTTP GET请求访问文件的URL即可。

例如,下载文件的URL格式如下:

http://<替换为你的IP>:9070/upload/crop_diseases/daipd/pest/402891cc6301912.jpg

3.3 下载服务的测试

可以在浏览器中直接输入下载链接,或者使用cURL命令下载文件:

curl -O "http://<替换为你的IP>:9070/upload/crop_diseases/daipd/pest/402891cc6301912101630191453e009a/402891cc6301c8ec016301c95a4b0b58/2.jpg"

如果下载成功,文件将被保存到当前目录。

总结

本文详细介绍了如何实现一个简单的文件上传和下载服务。我们使用FastAPI框架构建了文件上传服务,并通过Nginx实现了文件下载服务。通过这些步骤,您可以轻松地在自己的项目中实现文件管理功能。

参考资料


原文地址:https://blog.csdn.net/A15216110998/article/details/143858929

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!