【发布时间】:2020-11-13 02:31:58
【问题描述】:
用PHP上传多个大文件有什么好方法?
注意:在我的情况下,我并不需要非常大的文件,我需要上传 40-50 或 100 MB 之类的文件。我的目的和目标主要是关于在网站上上传文件,这些文件(pdf、doc 等)有时可能是 20-30 MB,很少是 100+MB,通常 php MAX_UPLOAD_FILESIZE 为 10-20 MB。我认为拥有大的 MAX_UPLOAD_FILESIZE 非常糟糕,无论如何允许在 PHP 中上传大文件(如 1GB+)确实是个坏主意。
即使在 SO 上,我也一直在阅读不同的解决方案,例如 plupload 和其他一些解决方案(HTTP Upload、bigUpload 等),我不确定哪种方式更好考虑。
原则上,我希望找到具有托管代码(不是废弃的库)并且可能遵循编码标准 (PSR) 的东西。
我认为从头开始编写将是一项艰巨的工作,但也许我错了,如果有人这样做,我想听听您的经验。当然,如果我找不到可以满足我需要的东西,我将不得不编辑现有的库或自己编写一个。
我会尝试 plupload,但我最担心的是它可能没有得到很好的维护。有一个 v3 版本,但稳定版仍然是 v2。如果我理解正确的话,GitHub 上这个库的最后一次更新是在 2017 年进行的,这并不能真正让我放心。 PHP,但总的来说,一切都变化很快。
问题一:上传完成后服务器才知道文件的大小
我认为这是第一个问题。在上传完成之前,我无法确定文件大小。如果由于文件太大而必须在 PHP 中出错,我需要先上传文件。我可以猜测 javascript 中的大小,但我认为这太容易破解了。 HTML5 也是如此。即使需要工作,所有客户端检查都可能被“黑客”或操纵,但仍然可行
问题2:文件分块,是不是最好的解决方案?
我读过文件分块,这很有趣,但这只是客户端,对吧?因为要在服务器端分块文件,你又回到问题 1,你需要在分块之前上传整个文件。客户端分块安全吗?是否有关于它的已知漏洞? (例如,我可以在文件上传时利用某些东西吗?)。稍后我会详细了解这一点。
还有上传所需的时间?假设您在 4G 中使用手机在表单上上传两个 PDF 或 JPG,您必须在信号不好的情况下上传 20-30 MB,假设您需要 30 秒或 1 分钟才能上传它们。服务器会在一段时间后停止监听吗?
在任何情况下,对于文件分块,我是否需要有一个大的 MAX_FILESIZE_UPLOAD?通常请求(作为 POST)与整个文件一起发送,这可能会因为大小超过 PHP 限制而返回错误?我想保持正常的 PHP 文件大小限制。
问题3:停止文件上传和删除中断上传
如果我停止或想停止上传会怎样?我猜服务器会发现自己有一个只是部分上传的临时文件。
那么,一般来说,让 cron 检查 /tmp(或其他)文件夹并删除未完成文件的最佳方法是什么?
问题 4:覆盖中断的上传
如果用户上传了一个应该覆盖旧文件的新文件,但旧文件没有完成怎么办?比方说,用户上传了一个 10MB 的文档,但意识到这是错误的。他可能会重新加载页面,或者再次单击“浏览”并上传新页面。因此,所有临时文件都应该有一个唯一的名称。如果我没记错的话,PHP 已经在 /tmp/ 中给了它们一个随机名称。这够了吗?手动给他们一个随机名称会更好吗,也许是基于时间戳?
在暗语中,类似于:
$fileName = time() . '-' . uniqid() . '.tmp';
问题5:多文件上传怎么办?
假设用户上传了 3 个文档,每个文档 10 MB。服务器应该同时接收它们还是一个接一个?或者也许是一样的?乍一看,我可能认为同时多次上传可能会给服务器负载带来更多问题。不过,也许这并不那么重要。
问题 6:可访问性
所有这些都可以轻松访问吗?您是否认为使用屏幕阅读器的用户能够毫无问题地上传多个(并且可能很大)文件?
结论
最后,如果我能找到满足我需求的好的解决方案,我将查看现有的库并进行一些测试。总的来说,我想阅读可以帮助我了解可能遇到的困难和问题的 cmets 或经验。
【问题讨论】: