我有一个奇怪的问题:我有一个AJAX文件上传器(fineuploader,正好相反),有一个处理上传的服务器端脚本(PHP)。虽然上传者有一个" allowedExtensions"设置,我希望在服务器端指定允许的扩展名,因此我的上传处理程序检查文件扩展名并在不允许文件扩展名的情况下返回错误响应。
我遇到的问题是,而在我的开发环境中,上传处理程序会立即返回此响应(如预期的那样)并且上传停止,在另一台服务器上继续上传只有在上传完成后才会返回响应。这可能意味着在收到错误消息之前需要很长时间。
查看开发人员工具中的网络信息,似乎浏览器一直在等待响应,并且(在有问题的服务器上)只在上传完成后才收到它,这似乎表明服务器上传处理程序脚本在收到所有数据后才实际执行。
在我看来,最可能的罪魁祸首是PHP处理上传/多部分表单数据的方式,但我无法弄清楚可能是什么。将不胜感激任何建议!
更新
两台服务器上的问题似乎都是一样的(我只是没注意到一台服务器的延迟)。所以看起来我的上传处理程序脚本在文件传输完成之前没有执行(这似乎可能是因为脚本在早期检查文件名并在扩展名错误时抛出异常,因此它应该在它启动后快速响应此外,它总是在上传完成时几乎立即响应 - 无论多长时间 - 表明它正在被执行时。
这只是PHP处理多部分表单数据的一个特性吗?如果文件名不合适,有没有办法让脚本立即响应?
答案 0 :(得分:2)
它可能就像开发服务器真正快速接收文件并快速响应一样简单。如果开发服务器位于您自己的计算机或本地开发服务器上,那么在生产服务器(通常在当前网络之外)上,100mbits connexion甚至会使相当大的文件变得非常快,上传时间很长......
可悲的是,在请求完成之前,PHP无法做出响应,因为这就是HTTP的本质。您可以在发送请求后切断连接,而不是读取响应,但在发送整个请求之前,您无法收到响应。虽然我曾经和我的朋友一起这样做,但是在问题结束之前将它们切断并回答,我可以确保只有人类能够胜任这一壮举!哦,不要这样做,它打破了友谊
o multipart并不意味着分块上传,这意味着使用消息边界将消息分成不同的部分以分隔不同的元素。如果流程在整个请求发送之前就开始了,那么您需要集成机制来检测您的请求的某个部分是否已完全上传,这会使网络比现在更难编程!
您可以查看此内容,了解多部分请求的示例htmlcodetutorial.com/forms/form_enctype.html