本节项目代码下载地址: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);
}
}
});
});
});
上传图片测试