Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flask 实现文件上传下载

Flask 实现文件上传下载

作者头像
王瑞MVP
发布于 2022-12-28 08:37:31
发布于 2022-12-28 08:37:31
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

Flask 针对文件的上传下载相关代码片段,多种方法,包括限制文件格式,大小等。

实现图片文件上传

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: 简单的实现文件上传任务.
import os
from flask import Flask, request, url_for, send_from_directory
from werkzeug import secure_filename

ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = "static/"               # 将文件上传到static目录
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024   # 限制只能上传16M的文件

html = '''
    <!DOCTYPE html>
    <form method=post enctype=multipart/form-data>
         <input type=file name=file>
         <input type=submit value=上传文件>
    </form>
    '''

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'],filename)

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            file_url = url_for('uploaded_file', filename=filename)
            return html + '<br><img src=' + file_url + '>'
    return html

if __name__ == '__main__':
    app.run()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: 通过使用flask_uploads插件完成快速上传
import os
from flask import Flask, request
from flask_uploads import UploadSet, configure_uploads, IMAGES,patch_request_class

app = Flask(__name__)
app.config['UPLOADED_FILE_DEST'] = "static/"   # 上传文件后的存储位置
patch_request_class(app, 32 * 1024 * 1024)      # 限制最大上传为32M
# UploadSet=允许上传的格式可配置为 All + TEXT + DOCUMENTS + IMAGES + DATA
photos = UploadSet('file', IMAGES)
configure_uploads(app, photos)
html = '''
    <!DOCTYPE html>
    <form method=post enctype=multipart/form-data>
         <input type=file name=photo>
         <input type=submit value=上传>
    </form>
    '''

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST' and 'photo' in request.files:
        filename = photos.save(request.files['photo'])
        file_url = photos.url(filename)  # 得到文件的路径
        return html + '<br><img src=' + file_url + '>'
    return html

if __name__ == '__main__':
    app.run()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--name: index.html 通过模板生成上传-->
<!DOCTYPE html>
<form method="POST" enctype="multipart/form-data">
     {{ form.hidden_tag() }}
     {{ form.photo }}
     {% for error in form.photo.errors %}
         <span style="color: red;">{{ error }}</span>
     {% endfor %}
     {{ form.submit }}
</form>

{% if file_url %}
<br><img src="{{ file_url }}">
{% endif %}

# name: app.py 通过使用WTF表单完成上传.
import os
from flask import Flask, render_template
from flask_uploads import UploadSet, configure_uploads, IMAGES, patch_request_class
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired, FileAllowed
from wtforms import SubmitField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'My Name Lyshark'
app.config['UPLOADED_PHOTOS_DEST'] = "static/"

photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app)  # 设置最大上传大小,默认16M

class UploadForm(FlaskForm):
    photo = FileField(validators=[
        FileAllowed(photos, u'只能上传图片!'),
        FileRequired(u'文件未选择!')])
    submit = SubmitField(u'上传')

# 列出所有文件
#{% for i in filename %}
#    {{ i }}
#{% endfor %}
@app.route("/list",methods=['GET'])
def ListFile():
    filename = os.listdir(app.config['UPLOADED_PHOTOS_DEST'])
    return render_template('login.html', filename=filename)

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    form = UploadForm()
    if form.validate_on_submit():
        filename = photos.save(form.photo.data)
        file_url = photos.url(filename)
    else:
        file_url = None
    return render_template('index.html', form=form, file_url=file_url)

if __name__ == '__main__':
    app.run()

上传文件并重命名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--name: upload.html 上传文件-->
<script type="text/javascript">
    function CheckFileType(filename)
    {
        var flag = false;
        var arry = ["bmp","jpg"];
        var index = filename.lastIndexOf(".");
        var ext = filename.substr(index+1);
        for(var i=0;i<arry.length;i++)
        {
            if(ext == arry[i])
            {
                flag=true;
                break;
            }
        }
        if(!flag){alert('错误,文件名后缀不合法!');}
    }
</script>

<body>
    <form action="/upload" enctype="multipart/form-data" method="post">
        <input type="file" name="file" onchange="CheckFileType(this.value)">
        <input type="submit" value="上传文件">
    </form>
    <p style="color: green">状态: {{ file_flage }}</p>
</body>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: app.py
from flask import Flask,render_template,request
import os,uuid

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 3000000   # 限制文件上传最大为3MB

@app.route("/upload",methods=['GET','POST'])
def upload_file():
    if request.method == "GET":
        return render_template("upload.html")
    elif request.method == "POST":
        file = request.files["file"]
        filename = str(file.filename)
        if len(filename) >= 20:          # 限制文件名的长度必须在20个字符以内
            return render_template("upload.html",file_flage="文件名长度超出了限制!")
        else:
            if filename.find(".") >= 0:  # 查找文件中是否包含点这个字符
                filetype = file.filename.split(".")[1]     # 取出文件类型,后期做判断
                if filetype != None and filetype == "bmp": # 后缀格式必须是bmp结尾
                    uid = uuid.uuid4()                     # 生成随机名称
                    save_file_name = str(uid) + "." + filetype  # 拼接名称
                    file.save(save_file_name)                   # 保存文件
                    return render_template("upload.html",file_flage="文件上传成功 {}".format(save_file_name))
            else:
                return render_template("upload.html",file_flage="没有选择文件,或不是图片格式,上传失败!")
    return render_template("upload.html",file_flage="文件上传失败,未知错误!")

if __name__ == '__main__':
    app.run()

实现文件下载功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--name download.html-->
<script type="text/javascript">
    function Download(filename)
    {
        if(filename){window.location.href='/download/?path=' + filename}
    }
</script>
<body>
    <form action="/download" enctype="multipart/form-data" method="get">
        <input type="text" name="down" onchange="Download(this.value)"/>
        <input type="submit" value="下载文件" >
    </form>
</body>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: app.py
from flask import Flask, render_template, request, Response
app = Flask(__name__)

@app.route('/download/', methods=['GET', 'POST'])
def download_file():
    if request.method == 'GET':
        args = request.args.get("path").replace("/","").replace("\\","")
        args = args.replace("<>","").replace("<!--","")
        args = "./templates/" + args
        print("下载的文件: {}".format(args))
        def send_file():
            store_path = args
            with open(store_path, 'rb') as targetfile:
                while 1:
                    data = targetfile.read(10 * 1024 * 1024)   # 每次读取10M
                    if not data:
                        break
                    yield data
        response = Response(send_file(), content_type='application/octet-stream')
        response.headers["Content-disposition"] = 'attachment; filename=%s'%args.split("/")[2]  # 取出下载的名字
        return response

if __name__ == '__main__':
    app.run()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MFC】MFC基础篇(1)
CFrameWnd: 框架窗口,负责创建应用主窗口,含标题栏,菜单栏,工具栏,状态栏等 。
半生瓜的blog
2023/05/13
1.8K0
【MFC】MFC基础篇(1)
VC6.0基础知识使用小结
这段时间在使用MFC做媒体播放器项目,查询了不少资料,用到的技术主要有ADO、多线程、DirectShow、MFC相关控件包括ActiveX控件(Windows Media Player、Active Movie3)的使用等等一些东西。用的主要参考文档有Windows Media Player相关的开发文档、MSDN。
ccf19881030
2019/04/24
1.3K0
OpenCV与MFC实战之图像处理 样本采集小工具制作 c++MFC课程设计
原文链接:https://www.cnblogs.com/DOMLX/p/12111102.html
徐飞机
2019/12/31
1.4K0
FFmpeg+SDL2 实现简易音视频同步播放器
这是实现的简易播放器的线程模型,通过这张图再结合我们之前博客中学习的内容,基本可以了解播放器的一个整体运行流程。具体代码也是根据这张图来实现。
字节流动
2023/09/04
6370
FFmpeg+SDL2 实现简易音视频同步播放器
Qt | windows视频播放器小项目
点击ctrl+r 运行 目前我测试了gif和MP4,其他文件应该也可以,留给大家完成。
Qt历险记
2024/10/28
2140
Qt | windows视频播放器小项目
MFC批量修改文件名工具
按下“添加文件”按钮后,打开一个文件对话框objFileDlg。但是要设置objFileDlg最大文件名缓冲区。然后获得第一个文件的起始位置,依次把全部的文件完整名添加到列表控件中,这里列表控件使用升序排序功能。
立羽
2023/08/24
3490
MFC批量修改文件名工具
QT入门10个小demo——MP4视频播放器
学完qt好几个月了,一直没做相关的项目巩固,这次分享10个qt相关的小项目来练练手。
秋名山码神
2023/10/16
2.4K0
QT入门10个小demo——MP4视频播放器
emWin视频播放器,含uCOS-III和FreeRTOS两个版本
第10期:视频播放器 配套例子: V6-918_STemWin提高篇实验_视频播放器(RTX版本,仅支持MDK4.74)
Simon223
2018/09/04
1.4K0
emWin视频播放器,含uCOS-III和FreeRTOS两个版本
​ZYNQ从放弃到入门(七)-三重定时器计数器 (TTC)
之前重点介绍了 Zynq All Programmable SoC 处理器系统 (PS) 中可用的私有定时器和看门狗。Zynq SoC 的 PS 还包含两个三重定时器计数器 (TTC),可提供更加灵活的定时资源。您可以将这些 TTC 用作定时器或在 Zynq SoC 的 EMIO 或 MIO 引脚上输出波形。
碎碎思
2022/06/06
2.4K0
​ZYNQ从放弃到入门(七)-三重定时器计数器 (TTC)
二、Qt定时器与文本编辑器制作《QT 入门到实战》
在 Qt 中使用 Label 可以显示文本,但 Label 不止可以显示文本,还可以用于图片的显示。
1_bit
2022/12/18
1.1K0
二、Qt定时器与文本编辑器制作《QT 入门到实战》
制作音乐播放器(C#)
实现音乐播放器的基本功能,可以选择文件播放,也可以拖拉文件播放。 本项目中,使用的是.wav文件。
跋扈洋
2021/04/25
1.2K0
制作音乐播放器(C#)
C++实现哈夫曼编码压缩软件
一个简单的压缩软件,利用哈夫曼思想,构造哈夫曼编码,实现对文件的二进制压缩,以及解压,再利用MFC制作可视化操作界面,美化软件又简化文件操作。(各个步骤有解释可看)
HcodeBlogger
2020/07/14
2.2K0
C++实现哈夫曼编码压缩软件
【MFC】 MFC文件操作和注册表操作
const char* p == char const *p 常量指针,表示指向的内容为常量,指针的指向可以修改,指针指向的内容不能修改。
半生瓜的blog
2023/05/13
1.4K0
【MFC】 MFC文件操作和注册表操作
基于emWin的WAV,MP3软解软件播放器,带类似千千静听频谱,含uCOS-III和FreeRTOS两个版本
第9期:WAV,MP3软解播放器,带类似千千静听频谱 配套例子: V6-916_STemWin提高篇实验_WAV,MP3软解播放器,带类似千千静听频谱(uCOS-III) V6-917_STemWin提高篇实验_WAV,MP3软解播放器,带类似千千静听频谱(FreeRTOS)
Simon223
2018/09/04
7160
基于emWin的WAV,MP3软解软件播放器,带类似千千静听频谱,含uCOS-III和FreeRTOS两个版本
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
和其他应用程序一样,我们希望通过点击文件并打开文件对话框,选择要播放的音频文件,下面我们来实现它。
全栈程序员站长
2022/08/29
2.3K0
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
MFC文件操作
文件操作:二进制文件和文本文件的区别。二进制文件将数据在内存中存在的模式原封不动的搬到文件中,而文本文件是将数据的asc码搬到文件中。 首先做一个读写文件的菜单,在CxxView里响应 1.C的方式: fwrite: size:Item size in bytes 每次写多少个字节 count:Maximum number of items to be written ,总共写几次。
全栈程序员站长
2022/07/18
2.4K0
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
和其他应用程序一样,我们希望通过点击文件并打开文件对话框,选择要播放的音频文件,下面我们来实现它。
花狗Fdog
2020/10/28
6.2K0
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
iOS-QQ音乐播放器的简单实现
一. QQ音乐播放器的简单实现 每个音乐播放器的实现都大致相同,个人认为难点在于歌曲播放与Slider的同步,歌词的解析与播放的同步。这些过程虽然繁琐,但是理解起来并不难。先来看看简单实现结果吧。 Q
xx_Cc
2018/05/10
2.9K0
课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]
原则:硬件搭建的不好,会让我们在调试过程中遇到很多玄学问题,比如:杜邦线接触不良,杜邦线短路等等,为了调试更加舒服,在搭建硬件平台时,接口要做一些处理,比如接口处用热熔胶粘好,防止脱落,布线要尽量整齐一些,如果要参加智能车类的比赛,一个好的布线布局,会让你的对手瞬间感受到压力!
全栈程序员站长
2022/11/07
4.3K0
课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]
《Android FFmpeg 播放器开发梳理》第一章 播放器初始化与解复用流程
这一章,我们来讲解播放器解复用(从文件中读取数据包)的流程。在讲解播放器的读数据包流程之前,我们先定义一个播放器状态结构体,用来记录播放器的各种状态。
音视频开发进阶
2019/08/09
1.4K0
推荐阅读
相关推荐
【MFC】MFC基础篇(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验