Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么使用Uploadify时会丢失一些POST数据?_Php_Flash_Upload_Uploadify - Fatal编程技术网

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

Php 为什么使用Uploadify时会丢失一些POST数据?,php,flash,upload,uploadify,Php,Flash,Upload,Uploadify,在过去的几个月里,我一直在我的PHP应用程序中使用Uploadify,我一直在努力追踪一个难以捉摸的bug。当发生致命错误时,我会收到电子邮件,它们为我提供了大量的详细信息。我收到了几十份。然而,我自己还不能重现这个问题。有些用户(像我一样)没有遇到问题,而其他用户则有 在我给出问题的细节之前,这里是流程 用户访问我正在使用的CMS中页面的编辑屏幕 页面的记录id作为隐藏值放入表单中 用户单击Uploadify browse按钮并选择一个文件(只允许选择单个文件) 用户单击“我的表单”的“提交

在过去的几个月里,我一直在我的PHP应用程序中使用Uploadify,我一直在努力追踪一个难以捉摸的bug。当发生致命错误时,我会收到电子邮件,它们为我提供了大量的详细信息。我收到了几十份。然而,我自己还不能重现这个问题。有些用户(像我一样)没有遇到问题,而其他用户则有

在我给出问题的细节之前,这里是流程

  • 用户访问我正在使用的CMS中页面的编辑屏幕
  • 页面的记录id作为隐藏值放入表单中
  • 用户单击Uploadify browse按钮并选择一个文件(只允许选择单个文件)
  • 用户单击“我的表单”的“提交”按钮
  • jQuery截取表单提交操作,触发Uploadify开始上传,并为提交操作返回false(手动取消表单提交事件,以便Uploadify接管)
  • Uploadify上载到自定义进程脚本
  • Uploadify完成上传并触发Javascript完成回调
  • Javascript回调调用$('#myForm').submit()来提交表单
这就是应该发生的事情。我收到过上传冻结率为100%的报告,还有一些报告显示“I/O错误”

发生的情况是,表单正在提交完成回调,但是表单中存在的一些post参数根本不在post数据中。页面的id(我前面说过是作为隐藏字段添加到表单中的)根本不在post数据($\u post)中,$\u post数组中没有“id”项。奇怪的是,post数据确实包含一些字段的值。例如,我有一个名为“name”的文本类型的输入,它代表记录名,它确实显示在post数据中

以下是我收集的信息:

  • 这在MacOSX10.5和10.6、WindowsXP和Windows7上都发生过。如果有帮助的话,我可以发布准确的用户代理字符串
  • 用户必须使用Flash 10.0.12或更高版本。我们这样做的目的是,如果表单小于10.0.12,那么表单将恢复使用普通的“文件”字段
有人知道这可能是什么原因吗

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

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

您是否尝试在Firefox中使用,以查看是否有某种重写导致post数据丢失?

+1因为我在uploadify中遇到了相同的问题。客户端报告错误,尤其是图像上载返回I/O错误或冻结时。无法重现开发中的错误-肯定与文件大小/连接无关。是的,我们正在通过scriptData注入必要的值。也许我们也应该尝试发送会话id。不确定是否不写。我需要检查一下。除非您的客户端是同质的,否则您必须通过scriptdata发送会话密钥;你不能依靠Flash发送cookies。许多组合都不起作用。我记不清具体情况,但就像Mac+FF下的flash会发送cookies,而Mac+Safari下的flash不会,反之亦然。类似地,Windows也有一些组合,flash不会发送cookies。基本上我们所做的就是发送参数,比如“user_id:1234,诸如此类:‘something’”。然后,上传脚本接收到这些,我们正在手动设置$\u COOKIE的值,如:$\u COOKIE['user\u id']=$\u POST['user\u id']。到目前为止,这已经奏效了…也许这不会一直奏效?有php会话知识的人会在这方面帮助你。在Django中,我确实需要编写一些代码来获取脚本数据并“手动”实例化会话。我会更新我的答案,这样你就可以看到我要做什么了。