flask文件的上传和下载
文件上传
import base64 import os import time from flask import Flask, render_template, request, jsonify, send_from_directory, abort from werkzeug.utils import secure_filename app = Flask(__name__) UPLOAD_FOLDER = 'upload' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER basedir = os.path.abspath(os.path.dirname(__file__)) ALLOWED_EXTENSIONS = set(['txt', 'png', 'jpg', 'xls', 'JPG', 'PNG', 'xlsx', 'gif', 'GIF']) # 判断文件的后缀 def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS # 用于测试上传 @app.route('/test/upload') def upload_test(): return render_template('upload.html') # 上传文件 @app.route('/api/upload', methods=['POST'], strict_slashes=False) def api_upload(): file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER']) if not os.path.exists(file_dir): os.makedirs(file_dir) f = request.files['myfile'] # 从表单的file字段获取文件,myfile为该表单的name值 if f and allowed_file(f.filename): fname = secure_filename(f.filename) print(fname) ext = fname.rsplit('.', 1)[1] unix_time = int(time.time()) new_filename = str(unix_time) + '.' + ext f.save(os.path.join(file_dir, new_filename)) return jsonify({"errno": 0, "errmsg": "上传成功"}) else: return jsonify({"errno": 1001, "errmsg": "上传失败"}) if __name__ == '__main__': app.run(debug=True)
上面我们写了一个上传接口,我们为了测试这个接口是否工作正常,还得写一个页面(upload.html):
<form id="form1" method="post" action="/api/upload" enctype="multipart/form-data"> <div> <input id="File1" type="file" name="myfile"/> <input type="submit">提交</input> </div> </form>
文件下载
文件下载要比上传简单的多,核心代码如下:
@app.route('/api/download/<filename>', methods=['GET'], strict_slashes=False) def download(filename): if request.method == "GET": if os.path.isfile(os.path.join('upload', filename)): return send_from_directory('upload', filename, as_attachment=True) abort(404)