第三方七牛云函数
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}})