在Flask中上傳本地圖片到服務器

方式一:存儲到網站服務器

1、上傳的圖片屬於二進制的文件類型:使用上傳的範式就是一個inpu
t標籤,文件類型爲file:
<input name="file" type="file" onchange="this.parentNode.submit()">
2、上傳的圖片爲了防止在網站中注入信息,一般不會保留原圖片的文件名,而是隨機生成一個文件名,使用的模塊就是UUID,而後綴名是需要保留的,可以事先設置好一個允許上傳的文件的後綴名集合:
ALLOWED_EXT=set(['png','jpg','jpeg','pdf','txt','gif'])
3、保存到服務器,同時將圖片的路徑存入數據庫

@app.route('/upload/', methods={"post"})  # 圖片上傳使用的方法都是使用post方法的
@login_required  # 需要登錄之後才能上傳照片
def upload():
    # print(type(request.files)) # ImmutableMultiDict包含的是所有上傳文件的一些基本信息
    file = request.files['file']  # http請求是可以通過多文件上傳的
    # dir(file) # 可以使用這個函數對文件的一些方法進行列舉
    # https://werkzeug-docs-cn.readthedocs.io/zh_CN/latest/
    # 需要對文件進行裁剪等操作
    file_ext = ''
    if file.filename.find('.') > 0:
        # 截取上傳的圖片的後綴名rsplit找右側的第一個.,設置成爲新圖片的後綴名
        file_ext = file.filename.rsplit('.', 1)[1].strip().lower()
    if file_ext in app.config['ALLOWED_EXT']:
        file_name = str(uuid.uuid1()).replace('-', '') + '.' + file_ext
        # print(file_name)
        # 保存到本地
        url = save_to_local(file, file_name)
        # url = qiniu_upload_file(file, file_name)
        if url != None:
            # 如果URL不空,保存鏈接地址和當前用戶的id
            db.session.add(Image(url, current_user.id))
            db.session.commit()
    return redirect('/profile/%d' % current_user.id)

方式二:存儲到雲服務器

目前比較好的有阿里雲、騰訊雲等的,七牛雲也是可以的(個人用戶可以有免費限定的空間和流量),可以百度一下開發者API。

本文的代碼和項目URL爲:
https://github.com/too-hoo/myinstagram/tree/master/myinstagram

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章