在Flask中上传本地图片到服务器

方式一:存储到网站服务器

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

你可能感兴趣的:(Python,Flask)