首页 > 其他分享 >flask(六)---flask上传文件

flask(六)---flask上传文件

时间:2023-05-15 10:11:07浏览次数:42  
标签:__ 文件 flask app filename --- file 上传

文件上传是很常见的功能,但这过程中却有很多技术环节需要学习

  • 文件类型,大小限制
  • 多文件上传
  • 文件名称安全检查

1.文件大小限制

出于资源考虑,不能不对用户上传的文件大小进行限制,这个在flask中实现非常简单

from flask import Flask, Request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

超过16M大小的文件将无法上传
如果你使用nginx为你的flask服务做反向代理,那么nginx也需要进行配置,将nginx client_max_body_size 修改为合适的数值,该值默认是1M

2. 文件类型检查

如果你希望用户只上传jpg类型的图片,那么最简单的办法是对用户的文件名称后缀做检查

ALLOWED_EXTENSIONS = set(['jpg'])
file = request.files['file']
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

# 判断文件类型是否符合要求
file_ok = allowed_file(file.filename)

这种方法完全依赖用户上传的文件名称,但用户完全可以将其他类型的文件的名字修改成以jpg结尾,更准确稳妥的方法是通过检查文件内容来判断文件类型

python中有一个filetype库可以根据文件内容对文件类型进行判断,其原理是读取文件的前262字节的内容,而不同类型的文件拥有独特的文件头,关于文件头可以查阅这篇文章 https://blog.csdn.net/xiangshangbashaonian/article/details/80156865 ,filetype正是利用了不同文件头的内容不同进而判断一个文件的类型,下面是一段示例代码

import filetype


kind = filetype.guess('1.jpeg')
print('File extension: %s' % kind.extension)
print('File MIME type: %s' % kind.mime)

3. 文件上传示例

3.1 代码结构图

 3.2 相关代码

upload.html

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

</head>
<body>
<form action="uploadfile" method=post enctype=multipart/form-data>
     <input type=file name=file id="file-input">
<button id="upload-btn" disabled>上传</button>
</form>

    <script>
const fileInput = document.getElementById('file-input');
const uploadBtn = document.getElementById('upload-btn');

fileInput.addEventListener('change', () => {
  if (fileInput.value) {
    uploadBtn.disabled = false;
  } else {
    uploadBtn.disabled = true;
  }
});


    </script>

</body>
</html>

文件上传.py

from flask import Flask, render_template, request, redirect, url_for
import os

app = Flask(__name__)

# 设置上传文件的保存路径
app.config['UPLOAD_FOLDER'] = './upload'

# 允许上传的文件类型
ALLOWED_EXTENSIONS = {'txt','pdf', 'png', 'jpg', 'jpeg', 'gif'}

# 检查文件类型是否允许上传
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# 显示上传页面
@app.route('/')
def index():
    return render_template('upload.html')

# 处理上传请求
@app.route('/uploadfile', methods=['POST'])
def upload():
    # 从请求中获取上传的文件
    file = request.files['file']

    # 如果文件已经存在,就提示该文件存在
    if os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], file.filename)):
        #os.remove(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))# 如果文件已经存在,就删除
        return '文件已存在'
    # 检查文件类型是否允许上传
    if file and allowed_file(file.filename):
        # 保存文件到指定路径
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
        # 重定向到上传成功页面,并传递文件名参数
        return redirect(url_for('success', filename=file.filename))
    else:
        # 返回上传失败的提示信息
        return '不支持上传格式,目前只支持txt,pdf, png, jpg, jpeg, gif'

# 显示上传成功页面
@app.route('/success')
def success():
    # 获取上传成功页面的文件名参数
    filename = request.args.get('filename')
    # 返回上传成功的提示信息
    return f'{filename}上传成功'

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

4.运行效果:

 4.1 上传图片测试

 

 

 4.2 上传相同图片提示已存在

 

标签:__,文件,flask,app,filename,---,file,上传
From: https://www.cnblogs.com/joyware/p/17401013.html

相关文章

  • uni-app: 从运行原理上面解决性能优化问题
    前言Uni-App,从了解到开发,相信大家都会觉得Uni-App性能不好,其实也这是非原生的弊病。ReactNative、Flutter等,非原生框架,性能上都会或多或少的折损。但各个框架,都会做出性能提升建议,所以开发者在开发前,多了解一下,后面维护升级等就会更方便一点,否则项目越来越大,后续开发就会越来越......
  • 微信小程序头像昵称填写能力-数据存储至缓存
    又到了一年一度的授权接口修改时间---ps.去年10月,希望今年能消停点。话不多说上代码。setName文件:<buttonclass="avatar-wrapper"open-type="chooseAvatar"bind:chooseavatar="onChooseAvatar"><imageclass="avatar"src="{{avatarUrl}}"&g......
  • C#上位机 APP监控西门子PLC S7-1200 1,C#开发上位机手机A
    C#上位机APP监控西门子PLCS7-12001,C#开发上位机手机APP,自己写的程序可提供部分2,通过VS2019开发安卓手机app3,全套源代码,现场运行设备实测有效。4,完整项目代码,拿来就可实际应用5,项目完整架构,本项目是针对起重机高空不易维护问题开发的6,功能完善,数据库,语音报警,数据报表都有。用户......
  • 固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码,使用 的是固高GTS-800 8轴运动控制
    固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码,使用的是固高GTS-8008轴运动控制卡。资料齐全,3轴点胶机样本程序,还有操作手册及各种C#事例程序,适合自己参照做二次开发,GTS-400的四轴运动控制卡是一样使用。YID:9614642908768262......
  • 小程序优化之旅(三) -- 请求缓存与预请求优化
    一、预请求概念首先在一开始还是先明确下这里所提及到的“预请求”的概念和常规的http的options请求有所区别,这篇文章所涉及到的预请求的概念都是在页面切换时候的页面请求的提请发送,跳转进入新页面后能够快速的获取到服务端的数据。1.1预请求的业务含义为啥需要要做这个......
  • 2023-05-15 leetcode周赛题
    找出转圈游戏输家mysolution100%passclassSolution:defcircularGameLosers(self,n:int,k:int)->List[int]:seen=set()now_num=1step=1seen.add(1)while1:stepSum=step*ktotal=now_num+stepSumnow_num=tot......
  • 小程序优化之旅(四) -- 项目持续化集成与自动化上传代码
    一、前情提要成1.1改造的目的概述在开发小程序的完成项目流程当中,免不了需要上传代码到微信平台,这个处理在以前是只能通过小程序开发者工具界面进行人工手动点击按钮进行;这个过程是十分枯燥并且一定程度上消耗了宝贵的人力资源。后续微信提供了小程序的CI工具,正式进入通过跑......
  • SSO2.0 4-20230514
                 ......
  • SpringBoot2原理篇-黑马
     原理篇1自动配置1.1bean的加载方式【一】1自动配置1.1bean的加载方式【一】1.1.1环境准备创建一个新的工程模块【Maven的,不是SpringBoot的】 直接创建 一个全新的Maven工程【添加坐标】<dependencies><dependency><groupId>org.spring......
  • Exadata X4-2 刷机至18.1.34版本遇到的问题
    客户有一套ExadataX4-2,计划从目前的11.2.3.3.1版本升级至18.1.34版本,但其中的一台计算节点在升级过程中遇到很多的故障,最终决定将这个已经升级失败的计算节点刷机至18.1.34版本。 本文主要记录将ExadataX4-2刷机至18.1.34版本时,遇到的一些异常情况。在刷机刚开始不久,会进入......