flask文件的上傳和下載

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

 

 

 

 

 

=================================================================================

碼字不易望各位老鐵多多支持

        

相關文章
相關標籤/搜索