falsk静态多层文件展示+下载

2021/11/30 23:40:01

本文主要是介绍falsk静态多层文件展示+下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

有偿求助,代码如下,主页展示和下载功能正常。但是只要把首页路由改了,比如改成“/1”,就只有首页可以用,点文件夹进入下层文件夹就报错。

【flask代码】

from flask import Flask
from flask import request
from flask import render_template, send_from_directory
import os
import time
app = Flask(__name__)
# 这里是预先将值存储在系统环境变量中了
app.secret_key = 'QWEaRdskjgkjgads3TYUdI2fdgfsgdafdsafdOPdkjgkjgdskjgkjgaf1234ffdfdasa56fdakjgkjgkfaaa'
DEFAULT_PATH = 'D:/'
current_path = ''

# 获取文件信息的函数
def get_files_data(path):
    """
    获取指定路径下的所有文件、文件夹的信息
    """
    global current_path
    files = []

    for the_name in os.listdir(path):
        # 拼接路径
        file_path = path+"/"+the_name

        # 判断是文件夹还是文件
        if os.path.isfile(file_path):
            the_type = 'file'

        else:
            the_type = 'dir'

        name = the_name

        size = os.path.getsize(file_path)
        size = file_size_fomat(size, the_type)
        # 创建时间
        ctime = time.localtime(os.path.getctime(file_path))

        # 封装成字典形式追加给 files 列表
        files.append({
            "name": name,
            "size": size,
            # 拼接年月日信息
            "ctime": "{}/{}/{}".format(ctime.tm_year, ctime.tm_mon, ctime.tm_mday),
            "type": the_type
        })
    # 更新当前路径
    current_path = path
    return files


def file_size_fomat(size, the_type):
    """
    文件大小格式化,携带单位
    """
    if the_type == 'dir':
        return '<DIR>'
    else:
        if size < 1024:
            return '%i' % size + ' B'
        elif 1024 < size <= 1048576:
            return '%.1f' % float(size/1024) + ' KB'
        elif 1048576 < size <= 1073741824:
            return '%.1f' % float(size/1048576) + ' MB'
        elif 1073741824 < size <= 1099511627776:
            return '%.1f' % float(size/1073741824) + ' GB'


def get_current_path():
    return current_path

@app.route('/', methods=['GET', 'POST'])
def jingshijiaoyu():
    if request.method == 'GET':
        return render_template("jingshijiaoyu.html",
                               data={
                                   "files": get_files_data(DEFAULT_PATH),
                                   "currentPath": DEFAULT_PATH,
                               })

    else:
        # POST 请求下获取传递的路径信息,并返回相应数据
        if request.form.get('pathText'):
            path_text = request.form.get('pathText')
            return render_template("jingshijiaoyu.html",
                                   data={
                                       "files": get_files_data(path_text),
                                       "currentPath": get_current_path(),
                                   })

@app.route("/download_file/<filename>")
def file_content(filename):
    # 若文件存在
    if filename in os.listdir(get_current_path()):
        # 发送文件 参数:路径,文件名

        return send_from_directory(get_current_path(), filename)
    else:
        return render_template("download_error.html", filename=filename)



if __name__ == '__main__':
    # 监听在所有 IP 地址上
    app.run()

【html文件代码】

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="Cache-Control" content="no-cache" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Expires" content="0" />
  <title>flask 文件共享</title>
  <link rel="stylesheet" href="../static/css/jingshijiaoyu.min.css">
  <script src="../static/js/jingshijiaoyu.min.js"></script>
</head>

<body>
  <div class="all-container">
    <h1>文件共享</h1>
    <div class="drivers-container">
      根目录:
      {% for driver in data.drivers %}
      <a href="javascript:;" location="{{driver}}" style="color:#66ccff">{{driver}}</a>
      {% endfor %}
      <h3 class="currentPath">当前路径:<span>{{data.currentPath}}</span></h3>
    </div>
    <button class="to-lastPath" onclick="window.history.back()">&nbsp;←&nbsp;&nbsp;上级目录</button>
    <table class="files-table">
      <tr>
        <!-- 表头 -->
        <td class="td-name">文件或文件夹</td>
        <td class="td-size">大小</td>
        <td class="td-ctime">创建日期</td>
      </tr>
      <!-- 将传上来的files进行遍历 输出HTML标签 -->
      {% for file in data.files %}
      <tr type="{{file.type}}">
        <td class="td-name {{file.type}}"><a href="/download_file/{{file.name}}"
            dirname="{{file.name}}">{{file.name}}</a></td>
        <td class="td-size">{{file.size}}</td>
        <td class="td-ctime">{{file.ctime}}</td>
      </tr>
      {% endfor %}
    </table>
    <form action="/" method="POST" style="display: none;" id="pathForm">
      <input type="text" name="pathText" value>
      <input type="submit">
    </form>
    <section class="flash-tablet" style="display: none;">
      <div class="inner-container">
        <div class="drivers-container">
          根目录:
          {% for driver in data.drivers %}
          <a href="javascript:;" location="{{driver}}" style="color:black">{{driver}}</a>
          {% endfor %}
          <h3 class="currentPath">当前路径:<span>{{data.currentPath}}</span></h3>
        </div>
        <button class="to-lastPath" onclick="window.history.back()">&nbsp;←&nbsp;&nbsp;上级目录</button>
        <button id="to-top">返回顶部</button>
      </div>
    </section>
  </div>
</body>

</html>



这篇关于falsk静态多层文件展示+下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程