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):
<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頁面,上傳文件並提交后,我們的接口會返回如下信息:
{
"errmsg": "\u4e0a\u4f20\u6210\u529f",
"errno": 0,
"token": "MTQ2MzU4MDc5Mi5KUEc="
}
同時upload目錄中也有了剛上傳的文件,表明測試成功。
文件下載
文件下載要比上傳簡單的多,核心代碼如下:
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等格式,雖然會下載,但是下載的文件名也不正確,切記切記
問題:上傳過程中,如果文件名是中文 問題未解決
哪位兄弟解決了(文件重命名不算解決)能不能貼上代碼
評論區一樓的兄弟:
把該行代碼fname = secure_filename(f.filename)替換為 fname = f.filename
這個辦法是可以解決,但是這樣就缺少了secure_filename方法中的一些驗證,
本打算重寫這個方法,進行一些驗證,但是對於中文應該做何種驗證,又無從下手了,有木有有意見的大兄弟。
=================================================================================
碼字不易望各位老鐵多多支持

