第三方七牛云函数
import qiniu.config
import logging
from qiniu import Auth, put_data, etag, urlsafe_base64_encode
#需要填写你的 Access Key 和 Secret Key
access_key = 'uzc59bVURbUbazey9vrexXKocNKBUN8NuLijk57N'
secret_key = '-9lenw28jU2REojvGkcsEPWk5Nm9V2HIVqb5Nkts'
def storage(file_data):
try:
#构建鉴权对象
q = Auth(access_key, secret_key)
#要上传的空间
bucket_name = 'ihome'
#上传到七牛后保存的文件名
# key = 'my-python-logo.png';
#生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name)
#要上传文件的本地路径
# localfile = './sync/bbb.jpg'
# ret, info = put_file(token, key, localfile)
ret, info = put_data(token, None, file_data)
except Exception as e:
logging.error(e)
raise e
print(ret)
print("*"*16)
print(info)
# assert ret['key'] == key
# assert ret['hash'] == etag(localfile)
print(type(info))
print(info.status_code)
if 200 == info.status_code:
return ret["key"]
else:
raise Exception("上传失败")
if __name__ == "__main__":
file_name = raw_input("input file name")
with open(file_name, "rb") as file:
file_data = file.read()
storage(file_data)
上传头像
class AvatarHandler(BaseHandler):
"""上传头像"""
@required_login
def post(self):
files = self.request.files.get("avatar")
if not files:
return self.write(dict(errcode=RET.PARAMERR, errmsg="未传图片"))
avatar = files[0]["body"]
# 调用七牛上传图片
try:
file_name = storage(avatar)
except Exception as e:
logging.error(e)
return self.write(dict(errcode=RET.THIRDERR, errmsg="上传失败"))
# 从session数据中取出user_id
user_id = self.session.data["user_id"]
# 保存图片名(即图片url)到数据中
sql = "update ih_user_profile set up_avatar=%(avatar)s where up_user_id=%(user_id)s"
try:
row_count = self.db.execute_rowcount(sql, avatar=file_name, user_id=user_id)
except Exception as e:
logging.error(e)
return self.write(dict(errcode=RET.DBERR, errmsg="保存错误"))
self.write(dict(errcode=RET.OK, errmsg="保存成功", data="%s%s" % (constants.QINIU_URL_PREFIX, file_name)))
上传房屋图片
class HouseImageHandler(BaseHandler):
"""房屋照片"""
@required_login
def post(self):
user_id = self.session.data["user_id"]
house_id = self.get_argument("house_id")
house_image = self.request.files["house_image"][0]["body"]
# 调用我们封装好的上传七牛的storage方法上传图片
img_name = storage(house_image)
if not img_name:
return self.write({"errcode":RET.THIRDERR, "errmsg":"qiniu error"})
try:
# 保存图片路径到数据库ih_house_image表,并且设置房屋的主图片(ih_house_info中的hi_index_image_url)
# 我们将用户上传的第一张图片作为房屋的主图片
sql = "insert into ih_house_image(hi_house_id,hi_url) values(%s,%s);" \
"update ih_house_info set hi_index_image_url=%s " \
"where hi_house_id=%s and hi_index_image_url is null;"
self.db.execute(sql, house_id, img_name, img_name, house_id)
except Exception as e:
logging.error(e)
return self.write({"errcode":RET.DBERR, "errmsg":"upload failed"})
img_url = constants.QINIU_URL_PREFIX + img_name
self.write({"errcode":RET.OK, "errmsg":"OK", "url":img_url})
前端js头像
$(document).ready(function () {
$.get("/api/profile", function(data){
if ("4101" == data.errcode) {
location.href = "/login.html";
}
else if ("0" == data.errcode) {
$("#user-name").val(data.data.name);
if (data.data.avatar) {
$("#user-avatar").attr("src", data.data.avatar);
}
}
})
$("#form-avatar").submit(function (e) {
// 组织浏览器对于表单的默认行为
e.preventDefault();
$('.image_uploading').fadeIn('fast');
var options = {
url: "/api/profile/avatar",
method: "post",
dataType: "json",
headers: {
"X-XSRFTOKEN": getCookie("_xsrf")
},
success: function (data) {
if ("0" == data.errcode) {
$('.image_uploading').fadeOut('fast');
$("#user-avatar").attr("src", data.data)
} else if ("4101" == data.errcode) {
location.href = "/login.html";
}
}
};
$(this).ajaxSubmit(options);
})
$("#form-name").submit(function(e){
e.preventDefault();
var data = {};
$(this).serializeArray().map(function(x){data[x.name] = x.value;});
var jsonData = JSON.stringify(data);
$.ajax({
url:"/api/profile/name",
type:"POST",
data: jsonData,
contentType: "application/json",
dataType: "json",
headers:{
"X-XSRFTOKEN":getCookie("_xsrf"),
},
success: function (data) {
if ("0" == data.errcode) {
$(".error-msg").hide();
showSuccessMsg(); // 展示保存成功的页面效果
} else if ("4001" == data.errcode) {
$(".error-msg").show();
} else if ("4101" == data.errcode) { // 4101代表用户未登录,强制跳转到登录页面
location.href = "/login.html";
}
}
});
})
})
html 代码
<ul class="menus-list">
<li>
<div class="menu-title">
<h3>头像</h3>
</div>
<div class="menu-content">
<img id="user-avatar" src="">
<div class="menu-text">
<form id="form-avatar" action="/api/profile/avatar" method="post" enctype="multipart/form-data">
选择头像:<input type="file" accept="image/*" name="avatar">
<input type="submit" class="btn btn-success" value="上传">
</form>
</div>
</div>
</li>
<li>
<div class="menu-title">
<h3>用户名</h3>
</div>
<div class="menu-content">
<form id="form-name" action="/api/profile/name" method="post">
<input type="text" name="name" id="user-name">
<input type="submit" class="btn btn-success" value="保存">
</form>
<div class="error-msg"><i class="fa fa-exclamation-circle"></i>用户名已存在,请重新设置</div>
</div>
</li>
</ul>
个人信息会返回头像
class ProfileHandler(BaseHandler):
"""个人信息"""
@required_login
def get(self):
user_id = self.session.data['user_id']
try:
ret = self.db.get("select up_name,up_mobile,up_avatar from ih_user_profile where up_user_id=%s", user_id)
except Exception as e:
logging.error(e)
return self.write({"errcode":RET.DBERR, "errmsg":"get data error"})
if ret["up_avatar"]:
img_url = constants.QINIU_URL_PREFIX + ret["up_avatar"]
else:
img_url = None
self.write({"errcode":RET.OK, "errmsg":"OK",
"data":{"user_id":user_id, "name":ret["up_name"], "mobile":ret["up_mobile"], "avatar":img_url}})