commit a67625e48c256fe916676dbd422ffffb1c30c9fb Author: da_nuo Date: Sat May 3 22:42:56 2025 +0800 main diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..86e5e64 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,23 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..db8786c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7f8da84 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/py_文件api.iml b/.idea/py_文件api.iml new file mode 100644 index 0000000..f571432 --- /dev/null +++ b/.idea/py_文件api.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/file/file.py b/file/file.py new file mode 100644 index 0000000..c64bd89 --- /dev/null +++ b/file/file.py @@ -0,0 +1,66 @@ +import os +import time +from typing import Any + + + +def get_file_list(dir_path: str) -> None | list[dict[str, str | int | None | Any] | dict[str, str | int]] | list[ + Any] | int: + """ + 获取目录内容列表(包含文件/文件夹信息) + 返回格式: [ + { + 'name': 名称, + 'type': ''或'', + 'size': 文件大小(字节),文件夹为None, + 'create_time': 创建时间 + }, + ... + ] + """ + try: + if os.path.isfile(dir_path): + return 1 + + if not os.path.exists(dir_path): + raise FileNotFoundError(f"路径不存在: {dir_path}") + + if not os.path.isdir(dir_path): + raise NotADirectoryError(f"不是有效目录: {dir_path}") + + print(dir_path) + + items = [] + for item in os.listdir(dir_path): + full_path = os.path.join(dir_path, item) + stat = os.stat(full_path) + + if os.path.isdir(full_path): + items.append({ + 'name': item, + 'type': '', + 'size': '-', + 'create_time': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(stat.st_ctime)) + }) + else: + items.append({ + 'name': item, + 'type': '', + 'size': stat.st_size, + 'create_time': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(stat.st_ctime)) + }) + + return items if items else [] + + except Exception as e: + print(f"错误: {str(e)}") + return 2 + +""" +result = get_file_list("D:\\") +if result: + for item in result: + size = "-" if item['type'] == '' else f"{item['size']} bytes" + print(f"{item['type']:^6} | {item['name']:>30} | {size:>20} | {item['create_time']}") + +""" \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..dd34895 --- /dev/null +++ b/main.py @@ -0,0 +1,68 @@ +from datetime import datetime + +from flask import Flask, render_template, request, send_file, jsonify +import make_html +import return_api + +app = Flask(__name__) + +root = "D:\\" + +@app.route('/') +def home(): + return render_template("index.html") + + +@app.route("/web/") +@app.route('/web') +@app.route('/web/') +def webs(subpath=None): + request_time = datetime.now() + formatted_time = request_time.strftime('%Y-%m-%d %H:%M:%S') + + if (subpath is None) or (subpath == "serviceworker.js"): + p = root + else: + if root[-1] == "\\" or "/": + p = root + subpath + else: + p = root + "\\" + subpath + + request_url = request.path + return_p = make_html.make(p, request_url, formatted_time, subpath) + + if return_p == 1: + return send_file(p, as_attachment=True) + if return_p == 2: + return render_template("error.html") + + return return_p + +@app.route("/api/") +@app.route('/api') +@app.route('/api/') +def api(subpath=None): + request_time = datetime.now() + formatted_time = request_time.strftime('%Y-%m-%d %H:%M:%S') + + + if (subpath is None) or (subpath == "serviceworker.js"): + p = root + else: + if root[-1] == "\\": + p = root + subpath + else: + p = root + "\\" + subpath + + request_url = request.path + return_p = return_api.make(p, request_url, formatted_time, subpath) + + if return_p == 1: + return send_file(p) + if return_p == 2: + return render_template("error.html") + + return jsonify(return_p) + +if __name__ == '__main__': + app.run(debug=True, port=41040) diff --git a/make_html.py b/make_html.py new file mode 100644 index 0000000..f243ca0 --- /dev/null +++ b/make_html.py @@ -0,0 +1,71 @@ +from jinja2 import Environment, FileSystemLoader + +from file import file + +# 创建模板环境 +env = Environment( + loader=FileSystemLoader("templates"), # 模板目录 + autoescape=True, # 自动HTML转义 + trim_blocks=True, # 去除块首尾空白 + lstrip_blocks=True # 去除块左侧空白 +) + +def make_file(file_list, requests_url): + c = [] + d = 0 + for item in file_list: + name = item["name"] + name = f'{name}' + + if item['type'] == "": + types = " " + else: + types = "dir" + + size = item['size'] + + if d == 0 or d % 2 == 0: + a = '' + types + "" + name +""+ str(size) + "" + item['create_time'] + "" + else: + a = '' + types + "" + name +""+ str(size) + "" + item['create_time'] + "" + c.append(a) + d += 1 + + b = "".join(c) + return b + + +def make(p, url, time, server_p): + get_p = file.get_file_list(p) + + if get_p == 1: + return 1 + if get_p == 2: + return 2 + + if server_p is None: + server_p = "root\\" + else: + server_p = "root/ " + server_p + + with open('templates\\zh_ch_moban.html', 'r', encoding='utf-8') as files: + template = files.read() + + files = make_file(get_p, url) + + # 定义替换数据 + data = { + "{h3}": "当前路径: "+url, + "{time}": "请求开始时间: "+time, + "{file_var}": "文件(夹)数量: " + str(len(get_p)), + "{server_path}": "服务器内部路径: " + server_p, + "{file}": files + } + + # 执行替换 + modified_html = template + for placeholder, value in data.items(): + modified_html = modified_html.replace(placeholder, value) + + # 输出结果 + return modified_html diff --git a/return_api.py b/return_api.py new file mode 100644 index 0000000..d43d28f --- /dev/null +++ b/return_api.py @@ -0,0 +1,26 @@ +import json + +from file import file + + +def make(path, requests_url, time, server_p): + get_p = file.get_file_list(path) + + if get_p == 1: + return 1 + if get_p == 2: + return 2 + + if server_p is None: + server_p = "root\\" + else: + server_p = "root/ " + server_p + + b = { + "time": time, + "server_path": server_p, + "requests_url": requests_url, + "file": get_p + } + + return b \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..081c880 Binary files /dev/null and b/static/favicon.ico differ diff --git a/templates/error.html b/templates/error.html new file mode 100644 index 0000000..407bb27 --- /dev/null +++ b/templates/error.html @@ -0,0 +1,33 @@ + + + + + +500 - 服务器内部错误 + + + + +
+
+

500 - 服务器内部错误,请求无法完成

+

出现此页面,代表本服务器软件正常运行,但因为其他因素导致了错误。

+

常见的错误包括:

+

 服务器软件没有访问目标目录的权限

+

 访问目标目录时操作系统返回了非期望的内容(可能是文件被锁定,目录不可达等)

+
+
+ + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..b4176e9 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,22 @@ + + + + + + File api 主页 + + +
+

File API 主页

+
+
+

  这是本系统的基础页面,包含以下两个可用的请求方式:

+
+

  web 目录浏览:web

+

  api 请求: api

+
+
+

by Da_nuo & branulf | 2025 +

+ + \ No newline at end of file diff --git a/templates/zh_ch_moban.html b/templates/zh_ch_moban.html new file mode 100644 index 0000000..0a965cb --- /dev/null +++ b/templates/zh_ch_moban.html @@ -0,0 +1,59 @@ + + + + + web 目录浏览 + + + + +

{h3}

+
+

{time}

+

{file_var}

+

{server_path}

+ 返回上一级目录 + + +
+ + + + + + + + + {file} +
typenamesizetime
+
+ +

Powered by Da_nuo & Branulf

+ + + + + +