为啥文件只能部分上传?

Posted

技术标签:

【中文标题】为啥文件只能部分上传?【英文标题】:Why might a file only be partially uploaded?为什么文件只能部分上传? 【发布时间】:2011-02-25 14:51:24 【问题描述】:

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

我正在改进我的 php 文件上传脚本中的错误处理,并试图弄清楚如何正确处理 UPLOAD_ERR_PARTIAL。

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

【问题讨论】:

【参考方案1】:

为什么一个文件可能只是部分 上传了吗?

这通常是由于用户取消上传造成的。

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

您应该提示他们再试一次,如果问题仍然存在,请联系网站所有者,包括尽可能详细的信息。

【讨论】:

我们应该如何在客户端使用JS和服务器端使用PHP处理这种情况?我的意思是,如果用户开始上传文件,然后在文件仍在上传时点击页面上的取消按钮,我可以调用.abort() PHP 将如何接收用户取消上传的信息? 【参考方案2】:

UPLOAD_ERR_PARTIAL 在文件数据后未找到 mime 边界时给出。造成这种情况的一个可能原因是用户取消了上传(按 ESC 等)。

我认为通知用户文件只是部分上传就足够了,重试将解决问题。

【讨论】:

+1 用于澄清“文件数据后未找到 mime 边界时” @Seb 也完全 +1 了那个。遇到了类似的问题,那个小小的旁注让我找到了源头。 :) 就我而言,我忘记了最后一个(在本例中为以下)边界上的前导 --。经验教训:-) @halfdan - 我不明白为什么 mime 边界会丢失。 PHP 不处理边界吗?或者,当程序保存文件(在我的情况下为 PDF 或 pptx)时,文件的开头和结尾不是由使用的程序设置的吗?【参考方案3】:

嗯,文件上传可能会被中断:

目的地空间不足

连接中断

损坏文件

名字错误

错误的扩展名

等等……

您可以做的最好的事情是在将文件实际发送到服务器之前,通过确实验证来验证和保护上传过程......

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

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

如果((

($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...
    
    

【讨论】:

嗯...是的,想象一下您的输入应该只处理图片并且用户尝试上传文档,如果它应该只是图片,您应该拒绝任何其他文件扩展名(在编辑评论下查看我的答案... 问题是文件名/扩展名如何导致 UPLOAD_ERR_PARTIAL? 嗯,它没有...文件扩展名只是警告您可能遇到的可能错误... :) 特别是对于 UPLOAD_ERR_PARTIAL,Halfdan 所说的似乎是唯一的原因。 .. 所以,只要通知用户进程被中断,应该再试一次!【参考方案4】:

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

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

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

我通过在上传的 PHP 脚本末尾插入来解决它

header ("Connection: close");

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

希望有人能帮忙。

感谢LINK

【讨论】:

为我工作!我花了几个小时认为我的脚本失败了 / flakey 似乎是服务器。 @Treemonkey 很高兴有用 ;-) 在此复制:***.com/questions/12425394/… 我看到很多人给出了这个答案,但如果有人能解释为什么强制禁用 keepalive 会起作用,那就太好了。【参考方案5】:

这可能对某些人有所帮助,但我遇到了同样的问题。 我的解决方案是卸载 libapache2-mod-php5filter 并将其替换为经典的 libapache2-mod-php5

【讨论】:

【参考方案6】:

我有同样的问题,并且与包 libapache2-mod-php5filter 相关,我删除了 p 和问题结束。 我希望有人可以提供帮助。

【讨论】:

@yellowantphil 对我来说似乎是一个边缘回答【参考方案7】:

我今天在本地机器上处理 ajax 文件上传时遇到了这个问题,直到我意识到(一小时后)我在另一个程序(MS Excel)中打开了同一个文件(CSV)。关闭相关程序后一切恢复正常。

希望有帮助!

【讨论】:

以上是关于为啥文件只能部分上传?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有些网站不能直接用FTP上传而只能用"SSH Secure Shell"

为啥在多部分上传到在 aws lambda 中运行的 express 过程中文件被损坏?

php上传文件为啥一定要用post

为啥我的wordpress总是能上传所有类型文件?

php图片上传为啥要base64上传

为啥微信小程序青云一次只能上传一张图片,上限是五张,每一次添加都会换掉之前的图片?