【问题标题】:PHP: What is a good way to upload multiple large files?PHP:上传多个大文件的好方法是什么?
【发布时间】: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 或经验。

【问题讨论】:

    标签: php forms file upload


    【解决方案1】:

    我会尽力帮助您解决问题:

    问题一:上传完成后服务器才知道文件的大小

    您需要配置upload_max_filesizepost_max_size 以允许最大文件上传您希望能够在单个请求中接收。

    是的,一旦文件上传,您就会知道文件的大小,因为您的脚本将在文件完全上传后执行。

    您可以在您的 javascript 中进行某种检查,以改善您对客户的 UI。

    此外,如果文件超过最大大小,则该文件将在您的服务器脚本中不可用。

    问题2:文件分块,是不是最好的解决方案?

    我认为这不会比上传整个文件更好。

    速度不会提高,所以虽然你可以并行上传,但上传速度将由客户端速度决定,你最终会以 10Mb/s 的速度上传 1 个文件或以 1Mb/s 的速度上传 10 个文件,在end 将是相同的。

    此外,您将在客户端和服务器上使用非常复杂的代码来处理它,并且您将不得不处理新的错误场景。

    不值得。

    问题3:停止文件上传并删除中断上传

    如果客户端停止上传,由于请求尚未完成,您的服务器代码将不会被执行。

    另外,重复的 tmp 文件不会有任何问题,当您使用 move_uploaded_file 移动文件时,文件会从 tmp 文件夹中删除,如果您不移动,脚本完成后文件将被删除。

    https://www.php.net/manual/en/features.file-upload.post-method.php

    问题5:多文件上传怎么办?

    对于多个文件上传,我更喜欢通过javascript对每个文件使用不同的请求,然后您可以并行化或开始一个一个上传文件并向用户展示上传过程。

    使用javascript可以查看每个请求的上传百分比,在上传大文件时非常有用,可以向用户反馈应用程序运行正常。

    问题 6:可访问性

    您将处理与上传小文件相同的可访问性问题。

    结论

    服务器端编码与您尝试上传的文件大小无关,因为它只是进行一些检查并将文件移动到正确的位置。

    您必须编写一些 javascript 代码来改进 ui 以向客户显示进度,如果您想添加取消上传的功能,这非常简单,因为它只是一个带有监听器的 http 请求更新进度(https://stackoverflow.com/a/47638378/1445024

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 2010-09-17
      • 2010-09-11
      • 2012-08-08
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多