nginx
client_max_body_size 10G;
fastapi
UPLOAD_DIRECTORY = r"G:\自制云盘" 你要保存的地址
TOKEN = '123n' 你的token
from fastapi import FastAPI, File, UploadFile, Header, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from typing import List
import os
from starlette.middleware.cors import CORSMiddleware
app = FastAPI()
# Directory to save the uploaded files
UPLOAD_DIRECTORY = r"G:\自制云盘"
TOKEN = '123n'
# 配置CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允许所有来源
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 验证token
def verify_token(token: str):
if token != TOKEN:
raise HTTPException(status_code=403, detail="Invalid token")
@app.post("/upload/")
async def upload_files(files: List[UploadFile], token: str = Header(...)):
verify_token(token) # 验证token
if not files:
raise HTTPException(status_code=400, detail="No files uploaded")
for file in files:
if file.size == 0:
raise HTTPException(status_code=400, detail=f"File {file.filename} is empty")
file_location = f"{UPLOAD_DIRECTORY}/{file.filename}"
with open(file_location, "wb") as f:
f.write(await file.read())
return {"message": "Files uploaded successfully"}
html
你的服务器 改成自己的localhost或者内穿或者域名
<!DOCTYPE html>
<html>
<head>
<title>Upload Multiple Files</title>
</head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<body>
<h3>Upload Multiple Files</h3>
<form id="upload-form" enctype="multipart/form-data" method="post">
<label for="token-input">Token:</label>
<input id="token-input" type="text" name="token" required>
<br><br>
<input name="files" type="file" multiple>
<br><br>
<input type="submit" value="Upload">
</form>
<progress id="progress-bar" value="0" max="100" style="width:100%;max-width: 300px;"></progress>
<div id="status"></div>
<script>
document.getElementById('upload-form').onsubmit = function(event) {
event.preventDefault();
var form = event.target;
var formData = new FormData(form);
var token = document.getElementById('token-input').value;
var progressBar = document.getElementById('progress-bar');
var status = document.getElementById('status');
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://你的服务器:8002/upload/', true);
xhr.setRequestHeader('token', token);
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
var percentComplete = (event.loaded / event.total) * 100;
progressBar.value = percentComplete;
}
};
xhr.onload = function() {
if (xhr.status == 200) {
status.innerHTML = 'Upload complete!';
} else {
status.innerHTML = 'Upload failed: ' + xhr.statusText;
}
};
xhr.onerror = function() {
status.innerHTML = 'Upload failed: Network error';
};
xhr.send(formData);
};
</script>
</body>
</html>
uvicorn yunpan:app --reload --host 0.0.0.0 --port 8002
0.0.0.0外网监听
uvicorn yunpan:app --reload --host 0.0.0.0 --port 8002
gunicorn yunpan:app -c gunicorn_yunpan.py (windwos不行)