当前位置: 首页 > news >正文

share.py

share_project/
├── share.py
└── templates/
    └── index.html
# save_as app.py
import os
from flask import Flask, render_template, request, send_from_directory, redirect, url_for

app = Flask(__name__)

# 使用Windows路径格式,此处设置为D盘根目录下的FileStorage文件夹
UPLOAD_FOLDER = r'D:\FileStorage'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024  # 最大上传100MB

# 创建存储目录(如果不存在)
if not os.path.exists(UPLOAD_FOLDER):
    os.makedirs(UPLOAD_FOLDER)


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # 检查上传请求
        if 'file' not in request.files:
            return redirect(request.url)

        file = request.files['file']

        if file.filename == '':
            return redirect(request.url)

        if file:
            # 安全保存文件
            filename = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
            file.save(filename)
            return redirect(url_for('index'))

    # 获取文件列表(排除子目录)
    files = [f for f in os.listdir(app.config['UPLOAD_FOLDER'])
             if os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], f))]
    return render_template('index.html', files=files)


@app.route('/download/<path:filename>')
def download(filename):
    # Windows安全路径检查
    safe_path = os.path.abspath(app.config['UPLOAD_FOLDER'])
    requested_path = os.path.abspath(os.path.join(app.config['UPLOAD_FOLDER'], filename))

    if not requested_path.startswith(safe_path):
        return "非法访问路径", 403

    return send_from_directory(
        app.config['UPLOAD_FOLDER'],
        filename,
        as_attachment=True
    )


if __name__ == '__main__':
    # 设置为局域网可访问(可选)
    app.run(host='0.0.0.0', port=5000, debug=True)
<!DOCTYPE html>
<html>
<head>
    <title>Windows文件传输服务</title>
    <style>
        body { font-family: Segoe UI, sans-serif; max-width: 800px; margin: 20px auto; }
        .container { padding: 20px; border: 1px solid #ddd; }
        ul { list-style-type: none; padding: 0; }
        li { padding: 8px; border-bottom: 1px solid #eee; }
        a { color: #0066cc; text-decoration: none; }
        a:hover { text-decoration: underline; }
    </style>
</head>
<body>
    <div class="container">
        <h1>📁 文件传输服务</h1>
        <h2>⬆ 上传文件</h2>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="file" style="padding: 8px;">
            <input type="submit" value="上传" style="padding: 8px 20px; background: #0066cc; color: white; border: none; cursor: pointer;">
        </form>

        <h2>📋 文件列表(存储路径:{{ UPLOAD_FOLDER }})</h2>
        <ul>
            {% for file in files %}
                <li>
                    <span style="width: 70%; display: inline-block;">{{ file }}</span>
                    <a href="{{ url_for('download', filename=file) }}">⬇ 下载</a>
                </li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>

相关文章:

  • Java集合之ArrayList(含源码解析 超详细)
  • python-leetcode 36.二叉树的最大深度
  • 使用vscode调试transformers源码
  • Linux中的Ctrl+C与Ctrl+Z
  • Docker 容器安装 Dify的两种方法
  • 审计级别未启用扩展模式导致查询 DBA_AUDIT_TRAIL 时 SQL_TEXT 列为空
  • Swupdate升级不强制依赖version字段
  • 装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
  • DeepSeek 通过 ollama 轻松本地部署
  • LeetCode 热题 100_N 皇后 (62_51_困难_C++)(递归(回溯))
  • 【一文读懂】JS与Java的区别
  • 基于Python的Diango旅游数据分析推荐系统设计与实现+毕业论文(15000字)
  • Android 平台GB28181设备接入实战指南
  • day 19
  • 量化自学 - 金融理论与python - Net Present Value 净现值
  • Linux arm64 IOMMU总结
  • 【产品小白】B端产品系统从需求到落地
  • 前端对话框项目 react如何实时接收,Node.js 服务端转发Coze API响应结果详解
  • deepin 下安装nvm(npm+node)
  • 【LeetCode】LCR 139. 训练计划 I
  • 习近平出席中拉论坛第四届部长级会议开幕式并发表主旨讲话
  • 济南市委副秘书长吕英伟已任历下区领导
  • 1156万+1170万,静安、宝山购彩者击中大乐透头奖
  • 乌外长:乌方准备无条件停火至少30天
  • 巴西总统卢拉将访华
  • 上报集团社长李芸:发挥媒体优势,让中非民心在数字时代更深层互联互通