Flask之文件上传操作
Python相关储备知识 – os模块
-
首先我们需要知道, Python中的os模块是一种方便的使用操作系统的方法。所以在对文件/文件夹进行处理时, 它能发挥很大的作用, 这里就不多详细谈论os模块过多。
-
os.path.split(path)
将path分割成目录和文件名以元组形式返回。
-
os.path.dirname(path)
返回父路径/父文件夹路径
- os.path.dirname(__ file __): 可以看出__file__表示了当前文件的path
-
os.path.join(path1[, path2[, …]])
将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
-
os.sep(path)
os.sep会根据你所处的平台,自动地采用相应的分割符号。
-
os.path.exists(path)
如果path存在,返回True;如果path不存在,返回False。
- os.path.exists(app.config[‘UP_DIR’] + “users” + os.sep):
-
os.path.isfile(path)
如果path是一个存在的文件,返回True。否则返回False。
-
os.path.isdir(path)
如果path是一个存在的目录,则返回True。否则返回False。
-
os.path.getsize(path)
返回path的文件的大小(字节)。
-
os.path.getatime(path)
返回path所指向的文件或者目录的最后存取时间。
-
os.path.getmtime(path)
返回path所指向的文件或者目录的最后修改时间。
-
os.makedirs(path)
需要递归创建的目录。
- os.makedirs(app.config[‘UP_DIR’] + “users” + os.sep)
-
os.remove
删除文件夹。
-
os.chmod
文件夹权限。
- os.chmod(app.config[‘UP_DIR’] + “users” + os.sep, “rw”)
Flask上传文件
-
服务端
from flask import Flask, request from werkzeug.utils import secure_filename # 上传文件文件名的安全获取 import os app = Flask(__name__) # 文件上传目录 app.config['UPLOAD_FOLDER'] = 'static/uploads' # 支持上传的文件格式 app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'} # 集合类型 # 支持上传的文件大小 app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 ''' 文件上传 三要素 - 表单提交是POST 的请求 - 表单 写入参数 enctype='multipart/form-data' 当上传内容非文本(MP3/MP4...)时候,如图片。需要将表单的设置成enctype编码格式 - 使用上传属性 file ''' ''' filename 获得上传文件名,secure_filename函数获得安全文件名,防止客户端伪造文件 ''' # 判断文件名是否是我们支持的格式 def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS'] @app.route('/upload', methods=['POST']) def upload(): upload_file = request.files['image'] print(upload_file.filename) if upload_file and allowed_file(upload_file.filename): filename = secure_filename(upload_file.filename) # 注意: 中文命名文件会被截断只留下文件类型 # filename = str(upload_file.filename) # 不安全获取 # 将文件保存到 static/uploads 目录,文件名同上传时使用的文件名 # with open('%s/%s' % (app.config['UPLOAD_FOLDER'], filename), 'wb') as f: # for line in upload_file: # f.write(line) '''将文件夹和文件名连接在一起''' upload_file.save(os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], filename)) return 'info is ' + request.form.get('info', '') + '. success' else: return 'failed' if __name__ == '__main__': app.run(port=5000, debug=True) -
注意: 用secure_filename获取中文文件名时,中文会被省略。
原因:secure_filename()函数只返回ASCII字符,非ASCII字符会被过滤掉。可以用不安全获取(filename)
解决方法: 在专栏里Flask中secure_filename()获取中文文件名问题
-
客户端
import requests file_data = {'image': open('Python.jpg', 'rb')} user_info = {'info': 'Python'} r = requests.post("http://127.0.0.1:5000/upload", data=user_info, files=file_data) print(r.text)


2457

被折叠的 条评论
为什么被折叠?



