为什么文件只能部分上传?

27

为什么文件可能只上传了部分内容?

我正在改进我的PHP文件上传脚本中的错误处理,并尝试找出如何正确处理UPLOAD_ERR_PARTIAL错误。

我应该提示用户再次尝试上传文件,还是告知他们存在更严重的问题,这可能会阻止他们上传可能合法的文件?

7个回答

26

上传文件数据后未找到mime边界时,会出现UPLOAD_ERR_PARTIAL。可能的原因是用户取消了上传(按下ESC等)。

我认为只需告知用户文件仅部分上传即可,并建议重新尝试上传以解决问题。


9
当文件数据结束后未找到MIME边界时,给你点赞(+1)以澄清该情况。 - Seb
@Seb 完全同意。我也遇到了类似的问题,那个小提示让我找到了源代码。 :) - Ingwie Phoenix
在我的情况下,我忘记了在最后一个(在这种情况下是接下来的)边界上加上前导的“--”。吸取了教训 :-) - karllindmark
1
@halfdan - 我不明白为什么会缺少MIME边界。PHP难道不处理边界吗?或者说,当程序保存文件(例如我的PDF或pptx文件)时,文件的开头和结尾不是由使用的程序设置的吗? - globalSchmidt

10

这是一篇旧文章,但我遇到了UPLOAD_ERR_PARTIAL的随机问题,并发布了我的解决方案。

问题在于上传2/3后我收到了UPLOAD_ERR_PARTIAL的错误,而没有任何来自客户端的中断。

我的问题与Keep-Alive服务器有关。

我通过在PHP上传脚本末尾插入解决了这个问题。

header ("Connection: close");

强制关闭连接解决了我的问题。

我希望有人能帮助我。

感谢这个 链接


1
对我有用!我花了几个小时认为我的脚本失败了/不可靠,结果发现是服务器的问题。 - Treemonkey
@Treemonkey 很高兴能有所帮助;-) - Alex Ball
在快速连续发送POST请求时,会出现“post data is missing”的错误。 - Meetai.com
我看到很多人都给出了这个答案,但如果有人能解释一下为什么强制禁用keepalive会起作用,那就太好了。 - georaldc

6

为什么文件只上传了一部分?

通常是用户取消上传的原因。

我应该提示用户再次尝试上传文件,还是应该告诉他们有更严重的问题阻止他们上传可能合法的文件?

您应该提示他们再次尝试上传,如果问题仍然存在,请联系站点所有者,并尽可能提供详细信息。


我们应该如何在客户端使用JS和服务器端使用PHP处理这种情况?我的意思是,如果用户开始上传文件,然后在文件仍在上传时单击页面上的取消按钮,我可以调用.abort(),那么PHP将如何接收用户取消上传的信息? - tonix
请联系网站所有者。 - Andrew Koster

2

好的,文件上传可能会被以下因素中断:

目标空间不足

连接中断

损坏文件

错误名称

错误扩展名

等等...

最好的方法是在实际将文件发送到服务器之前进行验证和保护上传过程...

我第一次制作文件上传脚本时,只用了1行代码,现在,同样的脚本看起来像一个网页 ;)

编辑(控制扩展名和文件大小的示例):

if ((

($file_up["type"] == "image/gif") ||

($file_up["type"] == "image/jpeg") ||

($file_up["type"] == "image/jpg") ||

($file_up["type"] == "image/pjpeg") ||

($file_up["type"] == "image/bmp") ||

($file_up["type"] == "image/tiff") ||

($file_up["type"] == "image/png")) &&

($file_up["size"] < 1050000))

{

    code if all ok...
    
    
}

嗯...是的,想象一下用户只能上传图片,如果上传了文档,应该拒绝任何其他文件扩展名(请查看我在编辑评论下的答案...)。 - Zuul
3
文件名/扩展名会如何引起UPLOAD_ERR_PARTIAL错误? - webbiedave
好的,它并不会...文件扩展名只是可能遇到错误的警告... :) 具体来说,对于UPLOAD_ERR_PARTIAL,Halfdan所说的似乎是唯一的原因...所以,只需通知用户进程被中断,应该再试一次! - Zuul

2
这可能对一些人有帮助,但我遇到了同样的问题。 我的解决方法是卸载libapache2-mod-php5filter并将其替换为传统的libapache2-mod-php5。

0

我有一个相同的问题,与 libapache2-mod-php5filter 包有关,我删除了 p,问题解决了。希望有人能帮忙。


1
@yellowantphil 看起来对我来说是一个边缘性的答案。 - Box Box Box Box

0
今天我在本地机器上处理ajax文件上传时遇到了这个问题,直到一个小时后才意识到我已经在另一个程序(MS Excel)中打开了同一个文件(CSV)。关闭该程序后,一切都恢复正常了。
希望这可以帮助到你!

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