2010-04-19 120 views
5

最近几个月我在我的PHP应用程序中一直使用Uploadify,我一直在试图追踪一个难以捉摸的bug。当发生致命错误时,我会收到电子邮件,并为我提供了大量细节。我收到了几十个。然而,我没有能够自己重现这个问题。一些用户(如我)没有遇到任何问题,而其他用户则可以。使用Uploadify时,为什么某些POST数据会丢失?

在我详细说明问题之前,请看下面的流程。

  • 用户访问我正在使用的CMS中的页面编辑屏幕。
  • 页面的记录ID作为隐藏值放入表单中。
  • 用户单击Uploadify浏览按钮并选择一个文件(只允许单个文件选择)。
  • 用户点击我的表单提交按钮。
  • jQuery拦截表单提交动作,触发Uploadify开始上传,并为提交动作返回false(手动取消表单提交事件以便Uploadify可以接管)。
  • Uploadify上传到自定义流程脚本。
  • Uploadify完成上传并触发Javascript完成回调。
  • Javascript回调调用$('#myForm')。submit()提交表单。

现在,这是应该发生的。我收到了100%的上传冻结报告以及显示“I/O错误”的其他报告。

发生了什么事情,表单正在提交完成回调,但表单中存在的一些帖子参数根本不在帖子数据中。我之前说过的页面的id是作为隐藏字段添加到表单中的,在发布数据($ _POST)中根本不存在 - $ _POST数组中没有用于'id'的项目。奇怪的是,发布数据DOES包含一些字段的值。例如,我有一个名为“name”的文本输入用于记录名称,并且它显示在发布数据中。

以下是我收集:

  • 这已经发生在Mac OSX 10.5和10.6,Windows XP和Windows 7的,我可以张贴详细的用户代理字符串是否有帮助。
  • 用户必须使用Flash 10.0.12或更高版本。我们已经完成了,所以如果他们有< 10.0.12,表单会恢复为使用正常的“文件”字段。

有没有人有任何想法可能是什么原因?

+0

+1因为我在Uploadify中遇到了同样的问题。客户报告错误,特别是图像上传返回I/O错误或冻结。无法在开发过程中重现错误 - 绝对不能与文件大小/连接相关。 – Jeriko 2010-04-26 12:48:13

回答

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') 
+0

是的,我们通过scriptData注入必要的值。也许我们应该尝试发送会话ID。 不确定不写。我需要检查的东西。 – 2010-04-26 18:14:24

+0

除非你的客户是同质的,你必须通过scriptdata发送会话密钥;你不能依靠Flash来发送cookie。许多组合不起作用。我不记得具体,但它就像闪光灯在Mac + FF会发送cookie,但在Mac + Safari下闪光灯不会,反之亦然。同样,Windows有闪存不会发送cookie的组合。 – 2010-04-27 07:54:39

+0

基本上我们正在发送的参数是“user_id:1234,blah:'something'”。然后,上传脚本正在接收这些内容,并且我们手动设置$ _COOKIE的值,如下所示:$ _COOKIE ['user_id'] = $ _POST ['user_id']。这工作到目前为止......也许这不会一直工作? – 2010-04-30 04:19:06

0

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

0

您是否尝试过在Firefox中使用Live HTTP Headers来查看是否存在导致发布数据丢失的某种重写事件?

相关问题