如何中止超过php上传上限的文件上传?

Kraang Prime

当上传的文件超出PHP设置的最大大小时,通常,在我能够处理服务器端的响应之前,整个文件都已上传。

在php.ini中,我将最大帖子大小和最大上传大小设置为2 MB。当我在上传表单中选择一个超过2 MB的文件(也就是一个1 GB的文件)时,服务器仍会接受该文件,但是我需要等到整个文件上传完毕后才能处理/处理上传事件。

现在,有趣的部分是上传进度会话返回100%,允许我返回对上传表单的控制(隐藏进度栏,再次显示上传表单和提交按钮),但是由于必须等待上传才能完成我无法将响应返回给用户。

对于我的项目,分为三个部分:

  1. 上传表格-包含将上传内容发布到“ upload.php”(隐藏的iframe)并监控“ upload_progress.php”(XHR)进度的代码。
  2. upload.php-这是负责接受文件的文件处理程序,然后根据文件类型,错误,成功等(跨帧脚本锁定到当前域和协议)将响应提升回上传表单。
  3. upload_progress.php-它仅读取会话数据以获取php的uploadprogress模块​​可用的上传进度。响应是一个整数。

问题是,如果上载太大,则#3显示为完成,但是#2继续接受数据,直到整个文件都已上载。

我想知道的是,有什么方法可以立即检测到它,而不是100%依赖JavaScript在上传之前检查文件大小,因为可以绕开它。我知道我可以在发送文件之前检查客户端,但是当文件太大时,我想在javascript中实现客户端中止之前,对上传进行适当的服务器端中止。意思是说,我不想为了服务器安全(文件类型,大小等)而依赖JavaScript。

希望我对所有事情都做了充分的解释以至于能够理解。我已经在PHP中看到这个问题很多年了,当收到的数据阈值超过php.ini中设置的限制时,我很惊讶文件上传没有在服务器端自动中止

如果有所作为,这是我的PHP版本详细信息

PHP 5.6.17-0+deb8u1 (cli) (built: Jan 13 2016 09:10:12) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

PHP FPM(在我的Apache配置中可以提供什么php)

PHP 5.6.17-0+deb8u1 (fpm-fcgi) (built: Jan 13 2016 09:10:13)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with the ionCube PHP Loader (enabled) + Intrusion Protection from ioncube24.com (unconfigured) v5.0.23, Copyright (c) 2002-2016, by ionCube Ltd.
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

和Apache(根据要求)

Server version: Apache/2.4.10 (Debian)
Server built:   Nov 28 2015 14:05:48
Server's Module Magic Number: 20120211:37
Server loaded:  APR 1.5.1, APR-UTIL 1.5.4
Compiled using: APR 1.5.1, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"
单击工作室

使用Javascript并在上传之前检查文件大小,尽管这不是如何从服务器端中途中止上传的示例。

这是一个实时示例:http : //codesheet.org/codesheet/E8ZwGzoV

<form method="post" target="submit" enctype="multipart/form-data" action="/post.php">

        <input type="file" name="file" id="file" />

        <input type="submit" name="submit" value="Submit" />

</form>

<div id="message"></div>

<iframe name="submit" width="100%" height="400px"></iframe>

JS在这里:

document.forms[0].addEventListener('submit', function( evt ) {

    var file = document.getElementById('file').files[0];

    // 1 MB = 1048576 this size is in bytes
    if(file && file.size < 2097152) {     // 2MB = 2097152

        //Submit form  
        document.getElementById('message').innerHTML = 'The File '+bytesToSize(file.size)+' is OK!';

    } 
    else 
    {

        //Prevent default and display error
        document.getElementById('message').innerHTML = 'The File '+bytesToSize(file.size)+' is to big!';
        evt.preventDefault();

    }
}, false);

function bytesToSize(bytes) {
   var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
   if (bytes == 0) return '0 Bytes';
   var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
   return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章