使用PHP进行非常大的上传
我想允许上传非常大的文件到我们的PHP应用程序中(数百个megs-8Gigs)。然而,这有几个问题 浏览器:使用PHP进行非常大的上传,php,upload,large-files,Php,Upload,Large Files,我想允许上传非常大的文件到我们的PHP应用程序中(数百个megs-8Gigs)。然而,这有几个问题 浏览器: HTML上传有糟糕的反馈,我们需要要么进行进度调查(这有点愚蠢),要么根本不显示反馈 Flash uploader在开始上载之前将整个文件放入内存 服务器: PHP迫使我们设置post_max_size,这可能导致容易被利用的DOS攻击。我不希望全局设置此设置 服务器还要求POST变量中包含一些其他变量,例如密钥。我们希望能够立即拒绝请求,而不是在上传整个文件之后 要求: HT
- HTML上传有糟糕的反馈,我们需要要么进行进度调查(这有点愚蠢),要么根本不显示反馈
- Flash uploader在开始上载之前将整个文件放入内存
- PHP迫使我们设置post_max_size,这可能导致容易被利用的DOS攻击。我不希望全局设置此设置
- 服务器还要求POST变量中包含一些其他变量,例如密钥。我们希望能够立即拒绝请求,而不是在上传整个文件之后
- HTTP是必须的
- 我对客户端技术很灵活,只要它能在浏览器中工作
- PHP不是必需的,如果有其他技术可以在linux环境下很好地工作,那就太酷了
- Java小程序怎么样?在我以前工作过的一家公司,我们就是这样做的。我知道小程序很差劲,尤其是在我们所有选项都可用的今天,但它们确实是解决web开发中遇到的类似桌面的问题的最通用的解决方案。请考虑使用APC检查进度和总文件大小。这里有一个关于它的例子。这可能会有所帮助。也许您可以在浏览器中使用Webdav和Javascript
将AJAX大文件上传到WebDAV,并取得进展
一个简单的库
然后,您可以让JS将用户重定向到成功页面。在关闭JS客户端->WebDAV之前,可以在PHP prelude中处理密钥和不能处理的内容。您可以为1个目录中的脚本设置post_max_大小。将上载脚本放在那里,只允许该脚本处理较大的大小。该脚本仍有可能受到大型/无用文件的攻击,但它避免全局设置 将其与APC结合使用,您可能会找到一些好的方法:
我想了解一下,这允许您上传一个大文件,并且仍然可以对该文件进行访问控制。这可能需要更长的时间来实现,但这可能是我所能想到的最安全的方式。我知道添加另一个依赖项很糟糕,但根据我的经验,大多数这样做的网站都在客户端使用flash,并将大文件作为块上传 adobe作为 我还发现了关于codeproject的本教程:
PS-我知道您使用的是PHP而不是.net,我认为重要的部分是flash;) Python处理程序? 使用Python POST处理程序而不是PHP。从PHP应用程序生成唯一标识符,客户端可以将该标识符放入HTTP头中。使用mod_python,在传输整个帖子正文之前拒绝或接受大型上传 我想 允许您检查标题并拒绝其余的POST输入。我没有试过,但可能是正确的途径 查看mod_python的源代码,通过read()对输入进行缓冲似乎允许对HTTP输入进行逐位计算。标题是第一位的
可以设置上传文件的最大大小;post_max_大小也是如此 e、 g:
php\u值上传\u最大\u文件大小10G
php_值post_最大尺寸10G
我在这方面做得很成功,我推荐它。它是一个jQuery/Flash脚本,用于处理大型上传,您可以向它传递额外的参数(如密钥)。要解决服务器端问题,只需使用以下代码。这些更改仅对调用它们的脚本生效:
//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
exit("Invalid request");
}
function isValid($key)
{
//Put your validation code here.
}
//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);
//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");
//Generally speaking, the memory_limit should be higher
//than your post size. So make sure that's right too.
ini_set("memory_limit","8200M");
编辑以回应您的评论:
考虑到您所说的,我担心您可能无法通过http满足您的要求。所有的解决方案都是为http添加了从未设计过的功能的代码
就像你自己说的,这是一个简单的协议。除了编写在浏览器、java小程序之外运行的自己的客户端软件,或者使用不同的协议(如FTP,专门为此设计的协议),您可能无法得到想要的
在给定的约束条件下,我已经尽了最大努力。抱歉,我做得太好了。尝试了所有这些。。。这是迄今为止我用过的最好的 看一看 一个很好的用于上传的java小程序
我用它上传图像,效果很好。我没有尝试过使用大于10MB的大文件,但我也应该使用真正大的文件 我知道它很老了,但也许现在有人也有这个问题。 现在,您只需使用Javascript和(比如)PHP就可以做到这一点。客户端不需要闪存或Java 演示:
想法是使用Javascript的Blob slice()方法对文件进行切片…试试这个:在一个聪明的PHP应用程序包装中使用一个基于Java的FTP小程序。APC技巧需要轮询,我不喜欢这一点,因为我们的负载平衡方案。您无法轮询,因为每个轮询请求可能被设置为不同于开始下载的服务器?您可以将轮询密钥存储在数据库中Peter D-correct Aiden,这是不可能的,因为我只能请求上载信息(即使使用密钥)在开始上传的服务器上。啊,我明白了。如果您启动了一个内部脚本来轮询正确的服务器,并将这些结果存储在中心位置,并且在前端有一个处理程序,该怎么办?Javascript不允许我读取本地文件的内容。我不知道“webdavsystem”到底是怎么做到的,但我认为他们仍然使用标准上传,并且在服务器上有一个特殊的处理程序。java小程序可能会做到这一点,但这只是问题的一半。Wordpress使用的是基于flash的上传程序。不幸的是,flash已经过时了
//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
exit("Invalid request");
}
function isValid($key)
{
//Put your validation code here.
}
//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);
//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");
//Generally speaking, the memory_limit should be higher
//than your post size. So make sure that's right too.
ini_set("memory_limit","8200M");