方式一:存儲到網站服務器
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