最近在写文件上传接口,这篇文章主要记录下文件上传注意的几个方面。
文件类型
一般的文件上传接口都是指定特定的文件才能允许上传,如图片类型支持jpg,png,tif,gif,pcx,tga,exif,fpx,svg等等,所以需要判断用户上传的文件是否满足要求,不能需要图片类型文件,而用户上传MP4的文件。具体检测方法如下:
首先需要将允许上传的文件类型存储在一个列表中,将用户上传的文件分割出文件后缀,进行判断。
1 | # 判断文件后缀是否在列表中 |
2 | def allowed_file(filename, ALLOWED_EXTENSIONS): |
3 | return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS |
文件大小
文件大小也是需要判断的,规定用户上传文件的大小,如果恶意用户随意上传大文件,会占据大量带宽,影响服务器运行。首先也需要设定允许上传最大文件大小。
1 | def file_len(filename_context): |
2 | ''' |
3 | 判断文件大小是否满足配置 |
4 | :param filename:文件内容 |
5 | :return: bool |
6 | ''' |
7 | size = len(filename_context) |
8 | if size > current_app.config['ALLOW_SIZE']: |
9 | return False |
10 | else: |
11 | return True |
文件重命名
用户文件重新命名也是非常重要的,防治恶意用户上传后门进行连接,二来可以统一下存储文件的命名格式,防止不规范的文件名称的出现。uuid既可以保证格式一样,还能保证文件名不重复。
1 | from shortuuid import uuid |
2 | def rename(name): |
3 | ''' |
4 | 重构名字的格式 |
5 | 保存的文件的命名为:uuid |
6 | :param name: |
7 | :return: |
8 | ''' |
9 | name1 = name.split('.')[-1] |
10 | new_name = uuid() + '.' +name1 |
11 | return new_name |