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/?均可以打開對應網站

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42105.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳細的講解一下網絡變壓器應用POE ,AT BT AF BF的概念,做電路連接指導分析

網絡變壓器在應用POE&#xff08;Power over Ethernet&#xff09;技術時&#xff0c;承擔著重要的角色。它不僅負責數據的傳輸&#xff0c;同時也為網絡設備提供電力。在IEEE 802.3標準中&#xff0c;定義了幾個與POE相關的標準&#xff0c;包括802.3af、802.3at、802.3bt等&a…

智慧景區解決方案PPT(89頁)

智慧景區解決方案摘要 解決方案概述智慧景區解決方案旨在利用現代信息技術解決景區管理機構面臨的保護與發展矛盾&#xff0c;推動服務職能轉變&#xff0c;促進旅游產業跨越式發展&#xff0c;實現旅游經營增長和管理成本優化。 宏觀政策背景國家旅游局發布的《“十三五”全國…

VideoAgent——使用大規模語言模型作為代理來理解長視頻

概述 論文地址&#xff1a;https://arxiv.org/pdf/2403.10517 本研究引入了一個新穎的基于代理的系統&#xff0c;名為 VideoAgent。該系統以大規模語言模型為核心&#xff0c;負責識別關鍵信息以回答問題和編輯視頻。VideoAgent 在具有挑戰性的 EgoSchema 和 NExT-QA 基準上進…

TD-MPC(Temporal Difference Model Predictive Control)人形機器人行走舉例

td-mpc控制機器人行走舉例 TD-MPC(Temporal Difference Model Predictive Control)是一種結合了時序差分學習和模型預測控制的強化學習方法,特別適用于控制復雜系統如人形機器人行走任務。TD-MPC通過使用模型預測控制(MPC)在已學到的環境模型中進行多步預測和優化,再結合…

數據特征采樣在 MySQL 同步一致性校驗中的實踐

作者&#xff1a;vivo 互聯網存儲研發團隊 - Shang Yongxing 本文介紹了當前DTS應用中&#xff0c;MySQL數據同步使用到的數據一致性校驗工具&#xff0c;并對它的實現思路進行分享。 一、背景 在 MySQL 的使用過程中&#xff0c;經常會因為如集群拆分、數據傳輸、數據聚合等…

qt 播放視頻

在 Qt 中播放視頻&#xff0c;你可以使用 Qt Multimedia 模塊。這個模塊提供了處理音頻和視頻內容的功能。以下是一個簡單的例子&#xff0c;展示了如何使用 QMediaPlayer 和 QVideoWidget 來播放視頻&#xff1a; 包含必要的頭文件&#xff1a; #include <QMediaPlayer&g…

容器:queue(隊列)

以下是關于queue容器的總結 1、構造函數&#xff1a;queue [queueName] 2、添加、刪除元素: push() 、pop() 3、獲取隊頭/隊尾元素&#xff1a;front()、back() 4、獲取棧的大小&#xff1a;size() 5、判斷棧是否為空&#xff1a;empty() #include <iostream> #include …

一個簡單的spring+kafka生產者

1. pom <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>2. 生產者 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; impo…

https 自簽證書相關生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件

文章目錄 前言https 自簽證書相關生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件1, 檢查openssl的版本2. 生成私鑰和證書簽署請求 (CSR)3. 生成自簽名證書4. 將證書和私鑰轉換為 PKCS12 格式的密鑰庫5. 創建信任庫 (Truststore)6. 將 PKCS12 文件轉換為 JKS 文件7.…

IDEA安裝IDE Eval Reset插件,30天自動續期,無限激活

第一步&#xff1a; 下載idea 注意&#xff1a;版本要是2021.2.2以下 第二步&#xff1a;快捷鍵CtrlAlts打開設置 第三步&#xff1a;打開下圖中藍色按鈕 第四步&#xff1a;點擊彈窗的 “” &#xff0c;并輸入 plugins.zhile.io 點擊 “ok” 第五步&#xff1a;搜索IDE Ea…

前端必修技能:高手進階核心知識分享 - CSS mix-blend-mode 圖片混合模式詳解

標簽定義及使用說明 mix-blend-mode 屬性描述了元素的內容應該與元素的直系父元素的內容和元素的背景如何混合。 語法 mix-blend-mod: 使用mix-blend-mode 各種混合模式實例 注意: Internet Explorer 或 Edge 瀏覽器不支持 mix-blend-mode 屬性。 &#xff08;還是那個熟…

AJAX-個人版-思路步驟整理版

前置知識&#xff1a;老式的web創建工程方法就是創建項目然后添加web工件&#xff0c;然后添加lib依賴如&#xff1a;tomcat,servlet&#xff0c;等。 傳統請求 對于傳統請求操作&#xff1a;整體流程也就是創建靜態頁面&#xff0c; <!DOCTYPE html> <html lang&q…

CSS技巧:用CSS繪制超寫實的酷炫徽章緞帶效果,超漂亮,超酷炫

為什么要用CSS來畫個徽章&#xff1f;這貨腦子進水了吧&#xff01; 今天在電腦前設計&#xff0c;要做徽章效果。突然覺得可以嘗試用css實現近似的效果。說干就干&#xff0c;打開編輯器&#xff0c;讓我的手指頭活躍起來&#xff01; 技術要點 通過多個圓形嵌套和漸變屬性…

【Rust練習】1.變量綁定與解構

地址&#xff1a;https://practice-zh.course.rs/variables.html &#x1f31f; 變量只有在初始化后才能被使用 // 修復下面代碼的錯誤并盡可能少的修改 fn main() {let x: i32; // 未初始化&#xff0c;但被使用let y: i32; // 未初始化&#xff0c;也未被使用println!(&quo…

WIN32核心編程 - 線程操作(一) 線程信息 - 線程控制

公開視頻 -> 鏈接點擊跳轉公開課程博客首頁 -> 鏈接點擊跳轉博客主頁 目錄 Thread Thread Control 創建 - Create 執行 - Execute 掛起 - Suspend 恢復 - Resume 終止 - Terminate 遠程 - Remote Thread Info GetCurrentThread/Id GetThreadContext CreateToo…

Vue iview-ui 被tooltip包裹的標題,點擊跳轉后,提示框不消失

tooltip包裹的標題&#xff0c;點擊跳轉后&#xff0c;提示框不消失 就會有這種顯示問題 下面這種錯誤方法不可行&#xff0c;解決辦法往下翻 css寫得沒錯&#xff0c;問題出在Javascript當中的 getElementsByClassName(“xxabc”)&#xff0c; 這個方法得到的是一個由class&q…

【Android】【WIFI】檢查 SDIO 設備的狀態

檢查 SDIO 設備的狀態 要檢查 Android 設備上 SDIO 設備的狀態&#xff0c;可以使用 ADB 命令來獲取系統信息。以下是一些示例命令&#xff1a; 列出 SDIO 設備 adb shell cat /proc/devices | grep sdio檢查 SDIO 模塊是否加載 adb shell lsmod | grep sdio獲取 SDIO 相關的…

IDEA中使用Maven打包及碰到的問題

1. 項目打包 IDEA中&#xff0c;maven打包的方式有兩種&#xff0c;分別是 install 和 package &#xff0c;他們的區別如下&#xff1a; install 方式 install 打包時做了兩件事&#xff0c;① 將項目打包成 jar 或者 war&#xff0c;打包結果存放在項目的 target 目錄下。…

自閉癥在生活中的典型表現

自閉癥&#xff0c;這個看似遙遠卻又悄然存在于我們周圍的疾病&#xff0c;其影響深遠且復雜。在日常生活中&#xff0c;自閉癥患者的典型表現往往讓人印象深刻&#xff0c;這些表現不僅揭示了他們內心的世界&#xff0c;也提醒我們要以更加包容和理解的心態去面對他們。 首先…

R語言4.3.0保姆級安裝教程,包含安裝包

[軟件名稱]&#xff1a;R語言4.3.0 R是用于統計分析、繪圖的語言和操作環境。R是屬于GNU系統的一個自由、免費、源代碼開放的軟件&#xff0c;它是一個用于統計計算和統計制圖的優秀工具。 獲取鏈接: https://pan.quark.cn/s/180306f47179 安裝步驟: 1.解壓壓縮包。 2.進入…