flask爱家租房项目开发(六)

本节项目代码下载地址:https://download.csdn.net/download/geek_xiong/11540896

目录

 

上传图片

七牛上传图片简单使用

上传图片后端编写

上传图片前端编写

上传图片测试


上传图片

此项目将文件、图片等上传到七牛服务器中,七牛地址:https://www.qiniu.com/

如果还没有七牛账号,请注册,现在七牛需要实名认证了!!!

登陆之后点击“管理控制台”,进入“用户产品主页”,添加一个对象存储,如何使用,可以参考官方文档

七牛上传图片简单使用

安装七牛(可参考官方文档)

pip install qiniu

在ihome/utils下创建一个文件image_storage.py,官方文档中有一个“上传文件”,将代码复制粘贴过来,并做以下修改

# -*- coding: utf-8 -*-

# 图片对象存储

# flake8: noqa

from qiniu import Auth, put_data, etag
import qiniu.config

# 需要填写你的 Access Key 和 Secret Key
access_key = '0JJmZK8kJJxxxxxxxxxxxxxxxxxxxxKoDnodDqt_'
secret_key = 'MfUi5vMyQ4xxxxxxxxxxxxxxxxxxxxgQG_b4kOqM'

def storage(file_data):
    """
    上传文件到七牛服务器
    :param file_data: 要上传的文件数据
    :return:
    """

    # 构建鉴权对象
    q = Auth(access_key, secret_key)

    # 要上传的空间
    bucket_name = 'ihome-python04'  # 七牛中新建的存储名

    # 生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, None, 3600)

    # 要上传文件的本地路径
    localfile = './sync/bbb.jpg'

    ret, info = put_data(token, None, file_data)
    print(info)
    print('*'*10)
    print(ret)


if __name__ == '__main__':
    with open('./1.png', 'rb') as f:
        file_data = f.read()
        storage(file_data)

注意:1.png在同目录下

运行此文件,返回的结果是:

_ResponseInfo__response:
<Response [200]>, 
exception:None, 
status_code:200, 
text_body:
    {"hash":"Fs6FFmVNeZgFsLgLgcQcAJMvQ6a9",
     "key":"Fs6FFmVNeZgFsLgLgcQcAJMvQ6a9"}, 
req_id:dO8AAAA9CfilaLoV, 
x_log:X-Log


**********


{'hash': 'Fs6FFmVNeZgFsLgLgcQcAJMvQ6a9', 
 'key': 'Fs6FFmVNeZgFsLgLgcQcAJMvQ6a9'}

其中有个“status_code”的结果是200,表示上传成功了,其次“key”其实就是上传后的图片的名字,可根据七牛存储融合 CDN 测试域名加上key就可以访问到刚上传的图片了

七牛服务器的ihome-python04存储空间中

点击内容管理

上传图片后端编写

# image_storage.py

from qiniu import Auth, put_data, etag
import qiniu.config

# 需要填写你的 Access Key 和 Secret Key
access_key = '0JJmZK8kxxxxxxxxxxxxxxxxoDnodDqt_'
secret_key = 'MfUi5vxxxxxxxxxxxxxx_-gQG_b4kOqM'

def storage(file_data):
    """
    上传文件到七牛服务器
    :param file_data: 要上传的文件数据
    :return:
    """

    # 构建鉴权对象
    q = Auth(access_key, secret_key)

    # 要上传的空间
    bucket_name = 'ihome-python04'

    # 生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, None, 3600)

    # 要上传文件的本地路径
    localfile = './sync/bbb.jpg'

    ret, info = put_data(token, None, file_data)

    if info.status_code == 200:
        # 上传成功,返回图片的名字key
        return ret.get('key')
    else:
        # 上传失败,抛出异常
        raise Exception('上传七牛失败')
# api/profile.py

from flask import g, request, current_app, jsonify

from . import api
from ihome.utils.commons import login_required
from ihome.utils.response_code import RET
from ihome.utils.image_storage import storage
from ihome.models import User
from ihome import db, constants


@api.route('/users/avatar', methods=['POST'])
@login_required
def set_user_avatar():
    """
    设置用户的头像
    参数:图片(对媒体表单格式), 用户id->g.user_id
    """
    # 装饰器中的代码已经将user_id保存到g中,所以视图中可以直接读取
    user_id = g.user_id

    # 获取图片
    image_file = request.files.get('avatar')

    # 判断是否上传图片
    if image_file is None:
        return jsonify(errno=RET.PARAMERR, errmsg='图片未上传')

    image_data = image_file.read()

    # 调用七牛上传图片
    try:
        file_name = storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='上传图片失败')

    # 保存头像地址到数据库中
    try:
        User.query.filter_by(id=user_id).update({"avatar_url": file_name})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存图片失败')

    # 头像的七牛地址
    avatar_url = constants.QINIU_URL_DOMAIN + file_name

    # 返回结果
    return jsonify(errno=RET.OK, errmsg='上传图片成功', data={'avatar_url': avatar_url})
# constants.py

# 七牛的域名
QINIU_URL_DOMAIN = 'http://pw5vkljsc.bkt.clouddn.com/'
# api/__init__.py
from . import demo, verify_code, passport, profile

上传图片前端编写

function getCookie(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : undefined;
}

function showSuccessMsg() {
    $('.popup_con').fadeIn('fast', function() {
        setTimeout(function(){
            $('.popup_con').fadeOut('fast',function(){}); 
        },1000) 
    });
}

$(document).ready(function () {
    $('#form-avatar').submit(function (e) {
        // 阻止表单的默认行为
        e.preventDefault();
        // 表单异步提交
        $(this).ajaxSubmit({
            url: '/api/v1.0/users/avatar',
            type: 'post',
            dataType: 'json',
            headers: {
                'X-CSRFToken': getCookie('csrf_token')
            },
            success: function (resp) {
                if (resp.errno == '0') {
                    var avatarUrl = resp.data.avatar_url;
                    $('#user-avatar').attr('src', avatarUrl);
                } else {
                    alert(resp.errmsg);
                }
            }
        });
    });
});

上传图片测试

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秒不可闫M先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值