from werkzeug.utils import secure_filename from flask import Flask,render_template,jsonify,request import time import os import base64 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)) #保存文件到upload目錄 token = base64.b64encode(new_filename) print token return jsonify({"errno":0,"errmsg":"上傳成功","token":token}) else: return jsonify({"errno":1001,"errmsg":"上傳失敗"}) if __name__ == '__main__': app.run(debug=True)
上面咱們寫了一個上傳接口,咱們爲了測試這個接口是否工做正常,還得寫一個頁面(upload.html):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>
好了,頁面也寫完了,咱們運行flask服務後,能夠訪問到http://127.0.0.1/test/upload
頁面,上傳文件並提交後,咱們的接口會返回以下信息:python
{ "errmsg": "\u4e0a\u4f20\u6210\u529f", "errno": 0, "token": "MTQ2MzU4MDc5Mi5KUEc=" }
同時upload目錄中也有了剛上傳的文件,代表測試成功。json
文件下載要比上傳簡單的多,核心代碼以下:flask
from flask import request,jsonify,send_from_directory,abort import os 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)
這裏主要須要注意的是send_from_directory方法,通過實測,需加參數as_attachment=True,不然對於圖片格式、txt格式,會把文件內容直接顯示在瀏覽器,對於xlsx等格式,雖然會下載,可是下載的文件名也不正確,切記切記api
哪位兄弟解決了(文件重命名不算解決)能不能貼上代碼瀏覽器
評論區一樓的兄弟:app
把該行代碼fname = secure_filename(f.filename)替換爲 fname = f.filenamepost
這個辦法是能夠解決,可是這樣就缺乏了secure_filename方法中的一些驗證,測試
本打算重寫這個方法,進行一些驗證,可是對於中文應該作何種驗證,又無從下手了,有木有有意見的大兄弟。spa
=================================================================================
碼字不易望各位老鐵多多支持