簡體   English   中英

php:// input對於小於10MB的請求為空

[英]php://input is empty for requests less than 10MB

問題:

低於10MB的原始POST請求不會到達php:// input緩沖區。 超過10MB的請求沒有問題。
有人知道嗎?

系統:
操作系統:Ubuntu 16.04
軟體:Apache with 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);

我發現了問題。

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

TL&DR

  • 我沒有代碼來處理$ _POST中的最后一個塊
  • 我將塊大小減小為upload_max_filesizepost_max_size ,取兩者中的較小者,減去邊界

奇特的東西

blueimp jQuery fileupload在php //:input緩沖區中發送塊,但最后一個塊。 最后一塊在$ _POST中發送。

我改變了什么

我添加了代碼來處理$ _POST中的最后一個塊:

因為$ _POST塊比upload_max_filesize大,所以它沒有到達(在$ _FILES ['file'] ['error']中給出錯誤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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM