Flask[接洽]
Flask上传文件
文件上传功能需要学习的范围:
- 文件类型,大小限制
- 多文件上传
- 文件名称安全检查
1.文件大小限制
出于资源考虑,需要对用户上传的文件大小进行限制
flask中的实现代码
1 | from flask import Flask, Request |
此代码的作用是阻止超过16M大小的文件上传 如果使用nginx为你的flask服务做反向代理,那么nginx也需要进行配置,将nginx client_max_body_size 修改为合适的数值,该值默认是1M
2. 文件类型检查
如果希望用户只上传jpg类型的图片,那么最简单的办法是对用户的文件名称后缀做检查
1 | ALLOWED_EXTENSIONS = set(['jpg']) |
此方法完全依赖用户上传的文件名称,无法应对简单的修改后缀名实现上传。
更准确稳妥的方法是通过检查文件内容来判断文件类型:
python中有一个filetype库可以根据文件内容对文件类型进行判断,其原理是读取文件的前262字节的内容,而不同类型的文件拥有独特的文件头,关于文件头可以查阅这篇文章 https://blog.csdn.net/xiangshangbashaonian/article/details/80156865 ,filetype正是利用了不同文件头的内容不同进而判断一个文件的类型,下面是一段示例代码
1 | import filetype |
3. 文件上传示例
常规上传操作示例
upload.html
1 |
|
处理文件上传的代码
1 | ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} |
启动服务后,在浏览器里输入 http://127.0.0.1:5000/uploadfile ,然后选择一个文件并点击upload按钮,就完成一次上传,你可以在项目的upload文件夹中找到你上传的文件
4. 文件名称安全检查
黑客们会通过修改上传文件的名称来达到修改文件存储位置的目的,如此一来就可以覆盖掉你服务器上的一个文件,这是十分危险的事情。
使用页面的表单进行文件上传,你在服务端获得文件名字就是你上传的文件名字,但黑客可以直接向你的服务器发送文件上传的请求,进而绕过网页提交,这时,他就可以修改上传文件的名字了。
使用requests上传文件并制定文件名称
1 | import requests |
接下来,你需要修改第3节中的do_upload函数
1 |
|
将原本使用secure_filename函数对文件名称做处理,改为直接使用file.filename
执行上传脚本发现,结果是存储到了upload的上一层文件夹中
files = {'file': ('../new_name.jpg', file)}
原因为不使用secure_filename函数,filename的值就是上传脚本里设置的值 “../new_name.jpg”
1 | os.path.join(UPLOAD_FOLDER, filename) |
使用join函数得到的结果就是”./upload/../new_name.jpg”,连续两个点表示跳跃到上一层目录,因此,文件就保存到了upload的上一层目录。
因此直接使用filename存在一定的缺陷,而使用secure_filename函数处理文件名称,则可以获得安全的文件名称。
1 | print(secure_filename('../new_name.jpg')) |
5. flask多文件上传
多文件上传,仅需要在form表单里增加一个file标签即可
1 | <form action="uploadfile" method=post enctype=multipart/form-data> |
服务端的处理
1 | file_lst = request.files.getlist('file') |
file_lst 存储的是上传的所有文件数据,剩下的,仅需要写一个for循环即可处理