nginx配置尝试

from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse, FileResponse, HTMLResponse
import logging
import os
from datetime import datetime
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="上传文件格式不符合要求")

    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": "文件保存失败"}, status_code=500)
    except Exception as e:
        logger.error("文件上传错误: %s", str(e))
        return JSONResponse(content={"message": "文件上传失败"}, 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("文件保存失败: %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)
        if not os.path.exists(file_path):
            return JSONResponse(content={"message": "文件未找到"}, status_code=404)
        return FileResponse(file_path, media_type="application/octet-stream", filename=file_name)
    except Exception as e:
        logger.error("文件下载错误: %s", str(e))
        return JSONResponse(content={"message": str(e)}, status_code=500)

@app.get("/list_files/", response_class=HTMLResponse)
async def list_files():
    """
    提供文件列表的 HTML 页面和文件上传功能
    """
    try:
        files = sorted(
            (f for f in os.listdir(dir_upload) if os.path.isfile(os.path.join(dir_upload, f))),
            key=lambda f: os.path.getmtime(os.path.join(dir_upload, f)),
            reverse=True
        )

        if not files:
            files_html = "<h2>没有可下载的文件</h2>"
        else:
            file_links = [f'<li><a href="/get_file/?file_name={file}">{file}</a></li>' for file in files]
            files_html = f"<ul>{''.join(file_links)}</ul>"

        html_content = f"""
        <html>
            <head>
                <title>文件列表和上传</title>
                <script>
                    async function uploadFile(event) {{
                        event.preventDefault();
                        const formData = new FormData();
                        const fileField = document.querySelector('input[type="file"]');

                        formData.append('file', fileField.files[0]);

                        const response = await fetch('/upload_file/', {{
                            method: 'POST',
                            body: formData
                        }});

                        const result = await response.json();
                        alert(result.message || '文件上传成功');
                        window.location.reload();
                    }}
                </script>
            </head>
            <body>
                <h1>文件列表和上传</h1>
                <form onsubmit="uploadFile(event)">
                    <input type="file" name="file" accept=".xlsx" required>
                    <button type="submit">上传文件</button>
                </form>
                <h2>文件列表</h2>
                {files_html}
            </body>
        </html>
        """
        return HTMLResponse(content=html_content)
    except Exception as e:
        logger.error("文件列表生成错误: %s", str(e))
        return HTMLResponse(content=f"<h2>错误: {str(e)}</h2>", status_code=500)

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

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

运行上述代码,打开http://127.0.0.1:1300/docs#/


接下来配置nginx文件

user _www;
worker_processes auto;
error_log /opt/homebrew/var/log/nginx/error.log;
pid /System/Volumes/Data/opt/homebrew/var/run/nginx.pid;

# Events
events {
    worker_connections 1024;
}

http {
    include /opt/homebrew/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 /opt/homebrew/var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    gzip on;

    server {
        listen 81;
        server_name localhost;

        location /file/ {
            proxy_pass http://127.0.0.1:1300/upload_file/;
        }

        location /get_file/ {
            proxy_pass http://127.0.0.1:1300/get_file/;
        }

        location /list_files/ {
            proxy_pass http://127.0.0.1:1300/list_files/;
        }
    }
}

接下来:

访问http://127.0.0.1:81/list_files/   http://127.0.0.1:1300/list_files/ 均可以打开对应网站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/778525.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解AT_dp_l Deque(区间动态规划)

题目 思路 考虑模拟博弈过程。 题目可以看成:先手希望X - Y最大&#xff0c;后手希望X - Y最小。 显然游戏过程中剩下的数必然是连续的一段。设 dp[i,j]​ 表示剩下下标为 [i,j] 的数时&#xff0c;先手&#xff08;并非当前的先手而是开始时的先手&#xff0c;下同&#xf…

[数据结构] 基于交换的排序 冒泡排序快速排序

标题&#xff1a;[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;冒泡排序 优化后实现&#xff1a; &#xff08;二&#xff09;快速排序 I、实现方法&#xff1a; &#…

中英双语介绍百老汇著名歌剧:《猫》(Cats)和《剧院魅影》(The Phantom of the Opera)

中文版 百老汇著名歌剧 百老汇&#xff08;Broadway&#xff09;是世界著名的剧院区&#xff0c;位于美国纽约市曼哈顿。这里汇集了许多著名的音乐剧和歌剧&#xff0c;吸引了全球各地的观众。以下是两部百老汇的经典音乐剧&#xff1a;《猫》和《剧院魅影》的详细介绍。 1.…

C++友元函数和友元类的使用

1.友元介绍 在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。 友元可以分为两种类型:类友元和函数友元。…

推荐好玩的工具之OhMyPosh使用

解除禁止脚本 Set-ExecutionPolicy RemoteSigned 下载Oh My Posh winget install oh-my-posh 或者 Install-Module oh-my-posh -Scope AllUsers 下载Git提示 Install-Module posh-git -Scope CurrentUser 或者 Install-Module posh-git -Scope AllUser 下载命令提示 Install-Mo…

云端AI大模型群体智慧后台架构思考

1 大模型的调研 1.1 主流的大模型 openai-chatgpt 阿里巴巴-通义千问 一个专门响应人类指令的大模型。我是效率助手&#xff0c;也是点子生成机&#xff0c;我服务于人类&#xff0c;致力于让生活更美好。 百度-文心一言&#xff08;千帆大模型&#xff09; 文心一言"…

【Linux】进程创建和终止 | slab分配器

进程创建 fork 1.fork 之后发生了什么 将给子进程分配新的内存块和内核数据结构&#xff08;形成了新的页表映射&#xff09;将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork 返回&#xff0c;开始调度器调度 这样就可以回答之前返回两个值&#xff1f…

线程池理解及7个参数

定义理解 线程池其实是一种池化的技术实现&#xff0c;池化技术的核心思想就是实现资源的复用&#xff0c;避免资源的重复创建和销毁带来的性能开销。线程池可以管理一堆线程&#xff0c;让线程执行完任务之后不进行销毁&#xff0c;而是继续去处理其它线程已经提交的任务。 …

web缓存代理服务器

一、web缓存代理 web代理的工作机制 代理服务器是一个位于客户端和原始&#xff08;资源&#xff09;服务器之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并指定目标原始服务器&#xff0c;然后代理服务器向原始…

【IT领域新生必看】 Java编程中的重载(Overloading):初学者轻松掌握的全方位指南

文章目录 引言什么是方法重载&#xff08;Overloading&#xff09;&#xff1f;方法重载的基本示例 方法重载的规则1. 参数列表必须不同示例&#xff1a; 2. 返回类型可以相同也可以不同示例&#xff1a; 3. 访问修饰符可以相同也可以不同示例&#xff1a; 4. 可以抛出不同的异…

【踩坑】解决undetected-chromedriver报错cannot connect to-chrome

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 网上方法都试了&#xff0c;什么指定version_main、添加option等。 最终&#xff0c;放弃&#xff0c;直接换selenium自己的吧&#xff1a; from web…

【论文解读】LivePortrait:具有拼接和重定向控制的高效肖像动画

&#x1f4dc; 文献卡 英文题目: LivePortrait: Efficient Portrait Animation with Stitching and Retargeting Control;作者: Jianzhu Guo; Dingyun Zhang; Xiaoqiang Liu; Zhizhou Zhong; Yuan Zhang; Pengfei Wan; Di ZhangDOI: 10.48550/arXiv.2407.03168摘要翻译: *旨在…

IDEA配Git

目录 前言 1.创建Git仓库&#xff0c;获得可提交渠道 2.选择本地提交的项目名 3.配置远程仓库的地址 4.新增远程仓库地址 5.开始进行commit操作 6.push由于邮箱问题被拒绝的解决方法&#xff1a; 后记 前言 以下操作都是基于你已经下载了Git的前提下进行的&#xff0c…

基于机器学习(支持向量机,孤立森林,鲁棒协方差与层次聚类)的机械振动信号异常检测算法(MATLAB 2021B)

机械设备异常检测方法流程一般如下所示。 首先利用传感器采集机械运行过程中的状态信息&#xff0c;包括&#xff0c;振动、声音、压力、温度等。然后采用合适的信号处理技术对采集到机械信号进行分析处理&#xff0c;提取能够准确反映机械运行状态的特征。最后采用合理的异常决…

算法系列--分治排序|再谈快速排序|快速排序的优化|快速选择算法

前言:本文就前期学习快速排序算法的一些疑惑点进行详细解答,并且给出基础快速排序算法的优化版本 一.再谈快速排序 快速排序算法的核心是分治思想,分治策略分为以下三步: 分解:将原问题分解为若干相似,规模较小的子问题解决:如果子问题规模较小,直接解决;否则递归解决子问题合…

Debezium报错处理系列之第110篇: ERROR Error during binlog processing.Access denied

Debezium报错处理系列之第110篇:ERROR Error during binlog processing. Last offset stored = null, binlog reader near position = /4 Access denied; you need at least one of the REPLICATION SLAVE privilege for this operation 一、完整报错二、错误原因三、解决方法…

智能化客户服务:提升效率与体验的新模式

在数字化浪潮的推动下&#xff0c;客户服务领域正经历着一场深刻的变革。智能化客户服务的兴起&#xff0c;不仅重塑了企业与客户之间的互动方式&#xff0c;更在提升服务效率与增强客户体验方面展现出了巨大潜力。本文将深入探讨智能化客户服务的新模式&#xff0c;分析其如何…

Error in onLoad hook: “SyntaxError: Unexpected token u in JSON at position 0“

1.接收页面报错 Error in onLoad hook: "SyntaxError: Unexpected token u in JSON at position 0" Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>) 2.发送页面 &#xff0c;JSON.stringify(item) &#xff0c;将对象转换为 JSO…

InspireFace-商用级的跨平台开源人脸分析SDK

InspireFace-商用级的跨平台开源人脸分析SDK InspireFaceSDK是由insightface开发的⼀款⼈脸识别软件开发⼯具包&#xff08;SDK&#xff09;。它提供了⼀系列功能&#xff0c;可以满⾜各种应⽤场景下的⼈脸识别需求&#xff0c;包括但不限于闸机、⼈脸⻔禁、⼈脸验证等。 该S…

运维锅总详解CPU

本文从CPU简介、衡量CPU性能指标、单核及多核CPU工作流程、如何平衡 CPU 性能和防止CPU过载、为什么计算密集型任务要选择高频率CPU、超线程技术、CPU历史演进及摩尔定律等方面对CPU进行详细分析。希望对您有所帮助&#xff01; 一、CPU简介 CPU&#xff08;中央处理器&#…