php://对于小于10MB的请求,输入为空

时间:2017-11-14 12:19:18

标签: javascript php apache post ubuntu-16.04

问题:

低于10MB的原始POST请求无法到达php://输入缓冲区。超过10MB的请求我没问题 谁有线索?

系统
操作系统:Ubuntu 16.04
软件:Apache与Nginx& PHP 7

故事:
我在我的一个网站上使用了blueimp jQuery fileupload。我上传的文件很大,超过1GB。上传脚本以10MB的块为单位上传,但最后一个块从未上传。当我将块大小降低到5MB时,即使第一个块也没有上传 我已经在Firefox开发人员工具中观看了上传,请求已经完成并且有效。

var abort_transfer = false;
$('#fileupload').fileupload({
    url: 'my_url',
    dataType: 'json',
    maxChunkSize: 1000000,
    add: function(e, data) {
        data.submit();
    },
    send: function(e, data) {
        $('button[type="submit"]').prop("disabled", true);
    },
    done: function(e, data) {
        console.log('done', e, data);
        $('button[type="submit"]').prop("disabled", false);
    },
    fail: function(e, data) {
        console.log('fail', e, data);
    },
    chunksend: function(e, data) {
        if (abort_transfer) return false;
    },
    chunkdone: function(e, data) {
        if (data['jqXHR']['responseJSON']['status'] == 'nok') {
            abort_transfer = true;
            console.log('chunkdone', data['jqXHR']['responseJSON']);
        }
    },
    progressall: function(e, data) {
        var progress = parseInt(data.loaded / data.total * 100, 10);
        $('#progress').css('width', progress + '%').text(progress + '%');
    },
    formData: function(form) {
        return [
            {name: 'action', value: 'upload-large-file'}
        ];
    }
})
.prop('disabled', !$.support.fileInput);

1 个答案:

答案 0 :(得分:0)

我发现了问题。

我的PHP设置是:
upload_max_filesize 2M
post_max_size 8M

TL& DR

  • 我没有代码来处理$ _POST
  • 中的最后一个块
  • 我将块大小降低为 upload_max_filesize post_max_size ,以较低者为准,减去边界

奇特的东西

blueimp jQuery fileupload在 php //:input 缓冲区中发送块,但是最后一块。最后一个块以 $ _ POST 发送。

我改变了什么

我添加了代码来处理$ _POST中的最后一个块:

因为$ _POST块比upload_max_filesize大,所以它没有到达(在 $ _ FILES ['文件']中出现错误1 ['错误' ] )。

我降低了块大小:

$post_max_size = (int)ini_get('post_max_size') * (substr(ini_get('post_max_size'), -1) == 'M' ? pow(1024, 2) : pow(1024, 3));
$upload_max_filesize = (int)ini_get('upload_max_filesize') * (substr(ini_get('upload_max_filesize'), -1) == 'M' ? pow(1024, 2) : pow(1024, 3));
$chunk_size = min($post_max_size, $upload_max_filesize) - (10 * 1024);

另外,请注意,块大于设置值,因为它包含边界和发布数据。因此, $ chunk_size 降低了10KB以确定。