python flask上传文件_flask上传文件

本文介绍了使用Python Flask框架处理文件上传的相关技术,包括文件大小限制、文件类型检查、文件名称安全检查和多文件上传。重点讲解了如何避免黑客通过修改文件名上传恶意文件,并展示了如何使用secure_filename函数确保文件名的安全。
摘要由CSDN通过智能技术生成

flask上传文件

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

文件类型,大小限制

多文件上传

文件名称安全检查

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. 文件上传示例

为了更好的演示文件名称安全检查,先向你展示一个常规的上传操作

upload.html

上传文件

处理文件上传的代码

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

UPLOAD_FOLDER = './upload'

def allowed_file(filename):

return '.' in filename and \

filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

@app.route('/uploadfile', methods=['POST', 'GET'])

def do_upload():

if request.method == 'POST':

file = request.files['file']

if file and allowed_file(file.filename):

filename = secure_filename(file.filename)

# filename = file.filename

file.save(os.path.join(UPLOAD_FOLDER, filename))

return render_template('upload.html')

启动服务后,在浏览器里输入 http://127.0.0.1:5000/uploadfile ,然后选择一个文件并点击upload按钮,就完成一次上传,你可以在项目的upload文件夹中找到你上传的文件

4. 文件名称安全检查

黑客们会通过修改上传文件的名称来达到修改文件存储位置的目的,如此一来就可以覆盖掉你服务器上的一个文件,这是十分危险的事情。

使用页面的表单进行文件上传,你在服务端获得文件名字就是你上传的文件名字,但黑客可以直接向你的服务器发送文件上传的请求,进而绕过网页提交,这时,他就可以修改上传文件的名字了

使用requests上传文件并制定文件名称

import requests

url = 'http://127.0.0.1:5000/uploadfile'

file = open("1.jpeg", 'rb')

files = {'file': ('../new_name.jpg', file)}

response = requests.post(url, files=files)

file.close()

接下来,你需要修改第3节中的do_upload函数

@app.route('/uploadfile', methods=['POST', 'GET'])

def do_upload():

if request.method == 'POST':

file = request.files['file']

if file and allowed_file(file.filename):

# filename = secure_filename(file.filename)

filename = file.filename

file.save(os.path.join(UPLOAD_FOLDER, filename))

return render_template('upload.html')

其实仅仅是做了一处修改,不再使用secure_filename函数对文件名称做处理,而是直接使用file.filename

执行上传脚本,你会发现,原本你希望文件上传后存储到upload文件夹中,但实际结果却是存储到了upload的上一层文件夹中,这到底是什么一回事呢?

如果不使用secure_filename函数,filename的值就是上传脚本里设置的值 "../new_name.jpg"

os.path.join(UPLOAD_FOLDER, filename)

使用join函数得到的结果就是"./upload/../new_name.jpg",连续两个点表示跳跃到上一层目录,如此一来,文件就保存到了upload的上一层目录了。

黑客就是通过这种手段上传恶意脚本到服务器的指定目录,而使用secure_filename函数处理文件名称,则可以获得安全的文件名称

print(secure_filename('../new_name.jpg'))

最终结果是new_name.jpg

5. flask多文件上传

多文件上传,只需要在form表单里增加一个file标签即可

服务端的处理,也很简单

file_lst = request.files.getlist('file')

file_lst 存储的是上传的所有文件数据,剩下的,你只需要写一个for循环就可以了处理了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值