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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大白话说Python+Flask入门(二)
笔者技术真的很一般,也许是只靠着笨鸟先飞的这种傻瓜坚持,才能侥幸的在互联网行业生存下来吧!
软件测试君
2023/11/22
2580
大白话说Python+Flask入门(二)
Flask(视图函数 四)
基于类的视图,可插拔视图 从Django学来的 好处: 类可以继承 代码可以复用 可以定义多种行为 from flask import Flask, request from flask.views import View app = Flask(__name__) class UserView(View): methods = ['GET', 'POST'] def get(self): return 'get' def post(self):
zx钟
2020/06/19
5200
Flask 入门系列教程(四)
在 WEB 应用当中,表单是和用户交互的最常见的方式之一,学习好表单,是非常重要的,用户登录注册、撰写文章等等操作都离不开表单的功能。表单的处理并不简单,除了要创建表单,还需要做相关的验证,还有错误提示等等。这些操作如果都从头开始编写,那么就太复杂了,不过幸运的是,我们有强大的 WTForms 帮助我们解决。
周萝卜
2020/10/10
1.4K0
Flask 入门系列教程(四)
flask avatars用户自己上传头像(flask 84)
from flask import Flask, render_template, url_for, send_from_directory, request, session, redirect from flask_avatars import Avatars
用户5760343
2019/08/20
1K0
flask简单上传demo
from flask import Flask, render_template, request,Response,redirect,url_for from werkzeug.utils import secure_filename import os, numpy as np, random, shutil, json app = Flask(__name__, template_folder='./html', static_url_path='') @app.route('/', methods=
一朵灼灼华
2022/08/05
4520
flask简单上传demo
Python 系列文章 —— flask app 详解
app from flask import Flask, render_template, redirect from flask_wtf import FlaskForm from flask_wtf.file import FileField from wtforms import StringField, DateField, RadioField, SelectMultipleField from wtforms.validators import DataRequired, InputRequir
玩转编程
2022/01/13
9840
flask 教程_python flask快速入门与进阶
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。
全栈程序员站长
2022/09/20
2.2K0
看完这篇文章还能不懂Flask这种Web框架吗?
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
IT派
2018/07/30
5310
flask 富文本编辑器(flask 22)
from flask_ckeditor import CKEditor, upload_success, upload_fail
用户5760343
2019/08/13
7560
Flask图像云端存储打造简洁高效的图片上传站点
在网络应用程序中,实现图片上传功能是一项常见的需求。Flask框架提供了简单而灵活的工具,使得构建这样的功能变得相对简单。本文将介绍如何使用Flask框架创建一个简单的图片上传站点,以及其中涉及的关键技术和步骤。
一键难忘
2024/05/16
2570
flask dropzone整合到form里面(flask 76)
from flask import Flask, render_template, request from flask_dropzone import Dropzone
用户5760343
2019/08/20
6760
flask dropzone整合到form里面(flask 76)
7.Flask文件上传
 1.1.上传文件和访问上次的文件 upload_file_demo.py from flask import Flask,request,render_template import os from werkzeug.utils import secure_filename from flask import send_from_directory app = Flask(__name__) #新建images文件夹,UPLOAD_PATH就是images的路径 UPLOAD_PATH = os.pa
zhang_derek
2018/08/01
3650
flask dropzone图片上传例子(flask 71)
from flask import Flask, render_template, request from flask_dropzone import Dropzone
用户5760343
2019/08/20
6230
flask dropzone图片上传例子(flask 71)
flask 文件上传页面(flask 21)
from flask import Flask,flash,redirect,render_template, url_for,session,send_from_directory,request import os import uuid from flask_wtf.csrf import validate_csrf from wtforms import ValidationError from form import LoginForm,UploadForm,MultiUploadForm
用户5760343
2019/08/13
1.2K0
flask dropzone上传之后跳转(flask 72)
from flask import Flask, render_template, request from flask_dropzone import Dropzone
用户5760343
2019/08/20
8270
Python-基于flask的接口框架
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。
用户9925864
2022/07/27
4670
Django之文件上传下载
在文件上传期间,实际文件数据存储在request.FILES中。此字典中的每个条目都是UploadedFile对象(或子类) – 上传文件的简单包装器。UploadedFile对象是对Python file对象的一个简单封装,并带有Django特定的附加功能。需要表示文件的时候,Django内部会使用这个类。UploadedFile对象拥有下列属性和方法:
菲宇
2022/05/06
3.5K0
Flask WTForms 表单插件的使用
在Web应用中,表单处理是一个基本而常见的任务。Python的WTForms库通过提供表单的结构、验证和渲染等功能,简化了表单的处理流程。与此同时,Flask的扩展Flask-WTF更进一步地整合了WTForms,为开发者提供了更便捷、灵活的表单处理方式。Flask-WTF是建立在WTForms之上的Flask扩展,旨在简化Web应用中表单处理的流程。它提供了与Flask框架的无缝集成,使得表单的创建、验证和渲染变得非常容易。通过Flask-WTF,开发者能够轻松地构建具有强大功能和良好用户体验的表单页面。
王瑞MVP
2023/11/26
3310
Flask WTForms 表单插件的使用
关于flask入门教程-bootstrap-fileinput实现文件上传
bootstrap-fileinput是一款非常优秀的HTML5文件上传插件,支持文件预览、多选等一系列特性。
python与大数据分析
2022/03/11
1.4K0
关于flask入门教程-bootstrap-fileinput实现文件上传
Flask 框架基础知识笔记
内置过滤器: tojson配合js使用,注意这里要避免HTML自动转义,所以加上safe过滤器
王瑞MVP
2022/12/28
2.4K0
相关推荐
大白话说Python+Flask入门(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验