七牛客户端没有按业务服务器指定的跳转

看七牛文档说

callbackUrlreturnUrl 不可同时指定,两者只可选其一。
callbackBodyreturnBody 不可同时指定,两者只可选其一。

但是只指定 callbackUrl,客户端没法跳转,我对这个过程的理解是七牛将 callbackBody post 到业务服务器,结果业务服务器根据这个 post 请求 redirect,却没有对客户端 redirect,这样客户端页面就会停在 http://up.qiniu.com/ ,为什么七牛没有对 redirect 进行转发呢,还是我理解错了?
(PS:POST请求之后我的业务服务器又接收到了GET请求,这个说明已经redirect过了,但客户端却没有redirect)

更新代码

from flask import request, g, redirect, url_for, render_template
from app import app, db, policy
from models import Image
import uuid
@app.route('/')
def index():
    policy.callbackUrl = 'http://example.com:8000/upload'
    policy.callbackBody = 'name=$(fname)&hash=$(etag)&title=$(x:name)&album=$(x:album)&description=$(x:description)&user_id=$(x:user_id)'
    uptoken = policy.token()
    key = str(uuid.uuid4())
    return render_template('index.html', uptoken=uptoken, key=key)

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        # save uploaded image infomation
        image = Image(title=request.form['title'], key=request.form['key'], album=request.form['album'], user_id=request.form['user_id'])
        db.session.add(image)
        db.session.commit()
    return redirect(url_for('index'))
<form method="post" action="http://up.qiniu.com" enctype="multipart/form-data">
    <input name="token" type="hidden" value="{{ uptoken }}">
    <input name="file" type="file">
    <input name="key" type="hidden" value="{{ key }}">
    <input name="x:name" type="text" value="" placeholder="name">
    <input name="x:description" type="text" value="" placeholder="description">
    <input name="x:album" type="text" value="" placeholder="album">
    <input name="x:user_id" type="hidden" value="{{ g.user.id }}">
    <input type="submit" value="Upload" />
</form>

日志显示 118.26.232.98(这个应该是七牛服务器) 先向业务服务器 POST 请求 /upload ,然后又 GET 请求 / ,如果不经过七牛中间这层,这正好是满足需要的业务逻辑,但经过七牛后客户端就没法正常跳转到 index 了。在 segmentfault 搜到两个同样问题的帖子,都是 @许式伟 大大亲自回答的,但都没有被采纳,不知具体是什么原因。
http://segmentfault.com/q/1010000000331498
http://segmentfault.com/q/1010000000328799

阅读 4.6k
3 个回答

这里补上最终解决方案,首先服务器端一定要返回一个 json 格式的数据,不出错的情况下,七牛会将这个 json 数据原样返回给客户端,因此需要前端对此进行处理,这里我使用了 jQuery-Form 插件。
这个 gist 是一个 demo https://gist.github.com/dengshuan/c4d783380f38d6a510b2

回调模式下,服务端将回调服务器的反馈原样返回给客户端,状态码恒定为200,不会将回调接口的状态码或响应头返回。
因此,需要在你的客户端来处理跳转。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进