使用Uploadify时,为什么会丢失一些POST数据?

5
我在我的PHP应用程序中使用Uploadify已经有几个月了,一直在试图追踪一个难以捉摸的错误。当致命错误发生时,我会收到电子邮件并提供大量细节。我已经收到了数十封这样的邮件。然而,我自己却无法复现这个问题。有些用户(像我自己)没有遇到问题,而其他用户则不同。
在我提供问题详细信息之前,先让我介绍一下流程。
- 用户访问我正在使用的CMS中页面的编辑屏幕。 - 页面的记录ID作为隐藏值放入表单中。 - 用户点击Uploadify浏览按钮并选择一个文件(只允许选择单个文件)。 - 用户点击我的表单提交按钮。 - jQuery拦截表单提交操作,触发Uploadify开始上传,并返回false以取消表单提交事件(手动取消表单提交事件以便Uploadify接管)。 - Uploadify上传到自定义处理脚本。 - Uploadify完成上传并触发Javascript完成回调。 - Javascript回调调用$('#myForm').submit()提交表单。
那就是应该发生的事情。我收到了上传在100%处冻结以及其他显示“I/O错误”的报告。
问题在于,表单在完成回调时提交,但是表单中存在的一些后置参数根本不在post数据中。我之前说过的页面ID添加为隐藏字段,但在post数据($ _POST)中根本没有它的项目--$_POST数组中没有'id'项。奇怪的是,post数据确实包含某些字段的值。例如,我有一个名为“name”的文本输入框,用于记录名称,它确实显示在post数据中。
这是我收集到的信息:
- 这种情况发生在Mac OSX 10.5和10.6、Windows XP和Windows 7上。如果有帮助,我可以发布确切的用户代理字符串。 - 用户必须使用Flash 10.0.12或更高版本。如果他们的版本小于10.0.12,我们已经将表单恢复为使用普通的“文件”字段。
有人有任何想法吗?这可能是什么原因?

+1 因为我也遇到了 Uploadify 相同的问题。客户报告错误,特别是图像上传返回 I/O 错误或冻结。无法在开发中重现错误 - 绝对不是文件大小/连接相关。 - Jeriko
3个回答

3
IOError: Client read error (Timeout?)

我虽然使用的是Python/Django服务器端,但经常遇到同样的错误。我认为这可能是客户端超时导致的,但现在回顾日志,似乎当我更改了身份验证例程中的某些内容后,这种情况就停止了。是否有可能是服务器收到文件后拒绝将其写入存储器?
此外,您知道有几个Flash客户端不发送cookie吗?您需要通过将会话密钥注入到uploadify的“scriptData”变量中来解决这个问题。
x--------------------------------
编辑。这段Python/Django代码开始了uploadify提交自身的例程:
# Adobe Flash doesn't always send the cookies, esp. from Apple Mac's.
# So we've told flash to send the session keys via POST. So recreate the
# session now. Also facilitates testing via curl.
cookie_name = settings.SESSION_COOKIE_NAME
if request.member.is_anonymous() and request.POST.has_key(cookie_name):

        # Convert posted session keys into a session and fetch session
        request.COOKIES[cookie_name] = request.POST[cookie_name]
        SessionMiddleware().process_request(request)

# boot anyone who is still anonymous
if request.member.is_anonymous():
    response['message'] = "Your session is invalid. Please login."
    return HttpResponse(simplejson.dumps(response), mimetype='application/json')

是的,我们正在通过scriptData注入必要的值。也许我们应该尝试发送会话ID。不确定是否需要写入。我需要检查一下。 - Chad Johnson
除非您的客户是同质的,否则必须通过脚本数据发送会话密钥;不能依赖Flash发送cookie。许多组合不起作用。我记不清具体情况了,但就像Mac+FF下的Flash会发送cookie,但Mac+Safari下的Flash不会,反之亦然。同样,Windows也有Flash无法发送cookie的组合。 - John Mee
基本上我们所做的是发送像 "user_id: 1234, blah: 'something'" 这样的参数。然后,上传脚本会接收这些参数,并且我们会手动为 $_COOKIE 设置值,例如:$_COOKIE['user_id'] = $_POST['user_id']。到目前为止这样做是有效的...但也许并非总是如此? - Chad Johnson
有了 PHP 会话知识的人才能帮助你。在 Django 中,我确实不得不编写代码来手动实例化会话。我会更新我的答案,这样你就可以看到我所做的事情。 - John Mee

0

Uploadify可能会改变表单。在uploadify完成并调用您的回调函数时,请查看表单的html/DOM树。


0

你尝试过在Firefox中使用Live HTTP Headers来查看是否发生了某种重写,导致POST数据丢失吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接