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):

<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方法中的一些驗證,

本打算重寫這個方法,進行一些驗證,但是對於中文應該做何種驗證,又無從下手了,有木有有意見的大兄弟。

 

 

 

 

 

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

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

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM