Python Flask – 实现本地文件的上传与下载

场景:

  • 点击上传文件按钮,选择需要上传的文件后上传
  • 文件上传成功后,会将文件保存到指定目录下
  • 限制上传文件的格式
  • 在前端点击文件后下载
  • 基于上述上传并保存到指定目录下的文件

上手

文件上传

app.py


@app.route('/upload', methods=['GET', 'POST'])
def upload_file():

    return render_template('upload.html')

app.config['UPLOAD_FOLDER'] = './upload'

file_dir = app.config['UPLOAD_FOLDER']

@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
"""
        文件上传
"""
    if request.method == 'POST':

        f = request.files['file']

        f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))

        print(request.files, f.filename)

        return '文件上传成功!'
    else:
        return render_template('upload.html')

upload.html

DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>上传title>

        <style>
            a{
                text-decoration: none;
                color: #2062e0;
            }
            a:hover{
                text-decoration: none;
                color: #2062e0;
            }
        style>
    head>
    <body>
        <h1 align="center">TESTh1>
        <div align="center">
            {# enctype:属性用于指定将上传文件数据发送给服务器端之前对表单数据进行编码的斱式 #}
            {# enctype="multipart/form-data" => 表示不对字符编码。当使用有文件上传控件的表单时,该值是必需的。 #}
            <form action="/uploader" method="post" enctype="multipart/form-data">
                <br><br>
                {# accept可以自定以文件上传格式 #}
                <input type="file" name="file" accept=".txt, .pdf, .doc, .docx, .md" value="{{ csrf_token }}" />
                <br><br>
                <input type="submit" value="提交" />
            form>

            <br><br>
        div>
    body>
html>

文件下载

app.py

@app.route('/download', methods=['GET', 'POST'])
def download():
"""
        文件下载
    :return:
"""
    timelist = []
    Foder_Name = []
    Files_Name = []

    lists = os.listdir(file_dir + '/')

    for i in lists:

        timelist.append(time.ctime(os.path.getatime(file_dir + '/' + i)))

    for k in range(len(lists)):

        Files_Name.append(lists[k])

        Foder_Name.append(lists[k] + " ~~~~~~~~~~~~~~~~~~~~~ " + timelist[k])

    print(file_dir)

    return render_template('download.html', allname=Foder_Name, name=Files_Name)

@app.route('/downloads/', methods=['GET', 'POST'])
def downloads(path):
"""
        重写download方法,根据前端点击的文件传送过来的path,下载文件

        send_from_directory:用于下载文件
        flask.send_from_directory(所有文件的存储目录,相对于要下载的目录的文件名,as_attachment:设置为True是否要发送带有标题的文件)
    :param path:
    :return:
"""
    return send_from_directory(app.config['UPLOAD_FOLDER'], path, as_attachment=True)

download.html

DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>文件下载title>

        <style>
            a{
                text-decoration: none;
                color: #2062e0;
            }
            a:hover{
                text-decoration: none;
                color: #2062e0;
            }
        style>

    head>
    <body>
        <div align="center">
            <h1>文件下载h1><br>
            {# 输出文件名及文件详细信息(文件时间信息等) #}
            {% for fruit in allname %}

                {{ fruit }}
            {% endfor %}
            <br><br><br>
            {# 将指定文件夹中的文件获取遍历显示 #}
            {% for n in name %}

                <a href="downloads/{{ n }}">{{ n }}a>
                <br>

            {% endfor %}
        div>
    body>
html>

运行

  • 文件上传和下载的视图函数代码都完成后,开始运行项目

app.py(在编写好试图代码的最下方编写运行代码)

"""
    运行项目
"""
if __name__ == '__main__':

    HOST = '0.0.0.0'

    app.run(host=HOST, debug=True)
  • 打开调试模式后,运行项目建议在Pycharm中的 Terminal命令行中输入以下运行
python app.py

整个app.py代码

import os
import time

from flask import Flask, render_template, request, send_from_directory

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():

    return render_template('upload.html')

app.config['UPLOAD_FOLDER'] = './upload'

file_dir = app.config['UPLOAD_FOLDER']

@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
    """  文件上传  """
    if request.method == 'POST':

        f = request.files['file']

        f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))

        print(request.files, f.filename)

        return '文件上传成功!'
    else:
        return render_template('upload.html')

@app.route('/download', methods=['GET', 'POST'])
def download():
    """  文件下载  """
    timelist = []
    Foder_Name = []
    Files_Name = []

    lists = os.listdir(file_dir + '/')

    for i in lists:

        timelist.append(time.ctime(os.path.getatime(file_dir + '/' + i)))

    for k in range(len(lists)):

        Files_Name.append(lists[k])

        Foder_Name.append(lists[k] + " ~~~~~~~~~~~~~~~~~~~~~ " + timelist[k])

    print(file_dir)

    return render_template('download.html', allname=Foder_Name, name=Files_Name)

@app.route('/downloads/', methods=['GET', 'POST'])
def downloads(path):
    """ 下载 """
"""
        重写download方法,根据前端点击的文件传送过来的path,下载文件
        send_from_directory:用于下载文件
        flask.send_from_directory(所有文件的存储目录,相对于要下载的目录的文件名,as_attachment:设置为True是否要发送带有标题的文件)
"""
    return send_from_directory(app.config['UPLOAD_FOLDER'], path, as_attachment=True)

"""
    运行项目
"""
if __name__ == '__main__':

    HOST = '0.0.0.0'

    app.run(host=HOST, debug=True)

模板文件中代码已完整

注意

  • 代码编写好后,需要在项目根目录先创建一个路径用于存放上传的文件
  • 即创建upload文件夹
  • 运行项目后,需要在浏览器地址后补充输入 /upload,即可进入上传页面
  • http://127.0.0.1:5000/upload,具体端口号需根据个人项目运行修改,可以在运行时看控制台
    Python Flask - 实现本地文件的上传与下载
    Python Flask - 实现本地文件的上传与下载
  • 下载页面
    Python Flask - 实现本地文件的上传与下载

; 项目文件目录

Python Flask - 实现本地文件的上传与下载

Original: https://blog.csdn.net/weixin_45681435/article/details/125681067
Author: FREE_QIU
Title: Python Flask – 实现本地文件的上传与下载



相关阅读

Title: django根据现有数据库表生成model

题记:django如果要并和原有的数据库,那么就需要把现有数据库的表写入model.py中。

文章目录

一,在setting.py中配置好连接数据库的参数

在setting中的DATABASESZ中配置默认参数,并在INSTALLED_APPS中导入模块名。

DATABASES = {
    'default':
    {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'jljupcs',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '',
    }
}

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'conversion',
]

在主项目目录下导入pymysql

import pymysql
pymysql.install_as_MySQLdb()

Python Flask - 实现本地文件的上传与下载

二,打开cmd或pycharm的Terminal输入命令

输入命令:

python manage.py inspectdb > [项目路径]/models.py

在cmd中输入命令:

Python Flask - 实现本地文件的上传与下载
打开pycharm终端输入命令:
Python Flask - 实现本地文件的上传与下载
最后在models.py中自动创建了数据库表对应的类。
Python Flask - 实现本地文件的上传与下载

三,managed = False 删除或改为 managed = True

修改managed让之后修改models即可对数据库进行操作,在终端输入:

python manage.py inspectdb

提示如果你想让Django创建、修改和删除表,请删除’ managed = False ‘行

Python Flask - 实现本地文件的上传与下载

四,执行迁移

在终端输入:

python manage.py makemigrations
python manage.py migrate

Python Flask - 实现本地文件的上传与下载

Original: https://blog.csdn.net/qq_38335295/article/details/123871683
Author: ChenWenKen
Title: django根据现有数据库表生成model

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/311846/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总