1、上传的图片属于二进制的文件类型:使用上传的范式就是一个inpu
t标签,文件类型为file:
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