首先是js本地压缩。参考:
http://www.cnblogs.com/baie/p/3618676.html
前台是Joy写的。
压缩后产生了base64。
不知道如何base64直传七牛。
所以只好先转给后台。
以form 表单的形式post。
看了下正则指南:
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
然后后台正则处理:
data = request.form['data']
# 正则提取。求更好的表达式 add by lee @14.9.21 18:45
rdata = re.findall(r';base64,(.+)',data)[0]
把base64转二进制,用七牛python SDK上传。
data =base64.b64decode(rdata)
# 因为是服务器传七牛,遂取消回调,所以g.user.id其实意义不大
uptoken, key = update(config.AVATAR_BUCKET , '', '', g.user.id, '', 'square100' )
import qiniu.io
ret, err = qiniu.io.put(uptoken, key, data)
后台保存图片地址,并修改用户role。
g.user.avatar_path = "http://"+config.AVATAR_BUCKET+".qiniudn.com/" + key
# 上传真实照片,可转变role。切记,只是0变成1,别管理员变成1了。 add by lee 14.9.12
if g.user.role == 0:
g.user.role = 1
print g.user.avatar_path
db.session.add(g.user)
db.session.commit()
对了,update函数也做了修改。原先只是针对预处理的。
现在加入不处理适配:
############ 将上传封装-以后可能用到: 头像、背景、相册 add by lee @14.8.22#############
# 如果是本地压缩,七牛不处理图片的话:
# 只需写: update(bucket,'','',g.user.id,'',pipeline)
def update(orgin_bucket, target_bucket, returnUrl, user_id, oops, pipeline):
conf.ACCESS_KEY = 'xxxxxxxxxxxxxxxxxxx'
conf.SECRET_KEY = 'xxxxxxxxxxxxxxxxxxx'
key = str(datetime.now())[:19]+str(user_id)
policy = rs.PutPolicy("%s:%s" % (orgin_bucket, key))
policy.returnUrl = returnUrl
policy.returnBody = '{"hash": $(etag), "key": "%s", "persistentId":"$(persistentId)"}'%key
policy.mimeLimit = "image/*"
policy.fsizeLimit = 5000000
# 本地压缩后上传和原图直传,上传策略不一样 add by lee @14.9.21 21:28
if oops == '':
entry = target_bucket+':'+ key
EncodeEntryURI = base64.urlsafe_b64encode(entry)
# oops 举例:'imageView2/1/w/100/h/100/q/100|saveas/'
Ops = oops + EncodeEntryURI
policy.persistentOps = Ops
policy.persistentPipeline = pipeline
uptoken = policy.token()
return uptoken, key