fileserver

This commit is contained in:
Vasily.onl 2025-06-23 12:01:06 +08:00
parent 245ded50ef
commit bf6fffd52c
3 changed files with 95 additions and 17 deletions

Binary file not shown.

View File

@ -1,24 +1,87 @@
import http.server
from fastapi import FastAPI, HTTPException
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.staticfiles import StaticFiles
import uvicorn
import os
PORT = 8050
PORT = 8051
DIRECTORY = "./data/db"
class CustomHandler(http.server.SimpleHTTPRequestHandler):
def translate_path(self, path):
# Serve files from the specified directory
path = super().translate_path(path)
return os.path.join(DIRECTORY, os.path.relpath(path, os.path.dirname(path)))
# Ensure the data directory exists (if not already handled elsewhere)
os.makedirs(DIRECTORY, exist_ok=True)
def run(server_class=http.server.HTTPServer, handler_class=CustomHandler):
server_address = ("", PORT)
httpd = server_class(server_address, handler_class)
print(f"Serving on port {PORT}... Press Ctrl-C to stop.")
try:
while True:
httpd.handle_request()
except KeyboardInterrupt:
print("\nServer stopped by user.")
app = FastAPI()
# Mount static files to serve content from the database directory
app.mount("/data", StaticFiles(directory=DIRECTORY), name="data")
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/files", response_class=HTMLResponse)
async def list_files():
files_html = ""
for root, _, files in os.walk(DIRECTORY):
for file in files:
file_path = os.path.join(root, file)
relative_path = os.path.relpath(file_path, DIRECTORY)
try:
file_size = os.path.getsize(file_path)
# convert to GB
file_size = file_size / (1024 * 1024 * 1024)
files_html += f"""
<li>
{relative_path} ({file_size:.3f} GB)
<a href="/data/{relative_path}" download="{relative_path}">Download</a>
<button onclick="deleteFile('{relative_path}')">Delete</button>
</li>
"""
except Exception as e:
files_html += f"<li>Error accessing {relative_path}: {e}</li>"
return f"""
<html>
<head>
<title>Files in Directory</title>
<script src="/static/script.js"></script>
</head>
<body>
<h1>Files in {DIRECTORY}</h1>
<ul>
{files_html}
</ul>
<p><a href="/">Back to Home</a></p>
</body>
</html>
"""
@app.delete("/delete_file/{filename}")
async def delete_single_file(filename: str):
file_path = os.path.join(DIRECTORY, filename)
if os.path.exists(file_path):
try:
os.remove(file_path)
return {"message": f"File {filename} deleted successfully.", "status": "deleted"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error deleting file {filename}: {e}")
else:
raise HTTPException(status_code=404, detail=f"File {filename} not found.")
@app.get("/")
async def root():
return HTMLResponse("""
<html>
<head>
<title>Market Data Server</title>
<script src="/static/script.js"></script>
</head>
<body>
<h1>Market Data Server</h1>
<p>Welcome to the Market Data Server.</p>
<h2>Database Files</h2>
<p>Access database files directly via /data/your_file.db</p>
<p><a href="/files">List Files</a></p>
</body>
</html>
""")
if __name__ == "__main__":
run()
uvicorn.run(app, host="0.0.0.0", port=PORT)

15
static/script.js Normal file
View File

@ -0,0 +1,15 @@
async function deleteFile(filename) {
if (confirm('Are you sure you want to delete ' + filename + '?')) {
const response = await fetch(`/delete_file/${filename}`, { method: 'DELETE' });
const data = await response.json();
alert(data.message);
if (response.ok) {
location.reload(); // Reload the page to update the file list
}
}
}
// Initial check when page loads
document.addEventListener('DOMContentLoaded', () => {
// No archive functions needed now
});