복붙노트

PHP의`post_max_size`를 능가하는 파일을 정상적으로 처리하는 방법은 무엇입니까?

PHP

PHP의`post_max_size`를 능가하는 파일을 정상적으로 처리하는 방법은 무엇입니까?

이메일에 파일을 첨부하고 업로드 된 파일이 너무 큰 경우를 정상적으로 처리하려고하는 PHP 양식 작업 중입니다.

파일 업로드의 최대 크기 인 upload_max_filesize와 post_max_size에 영향을주는 php.ini에는 두 가지 설정이 있음을 알게되었습니다.

파일의 크기가 upload_max-filesize를 초과하면 PHP는 파일의 크기를 0으로 반환합니다. 나는 그것을 확인할 수있다.

그러나 post_max_size를 초과하면 스크립트가 자동으로 실패하고 빈 양식으로 돌아갑니다.

이 오류를 잡을 방법이 있습니까?

해결법

  1. ==============================

    1.문서에서 :

    문서에서 :

    불행히도 PHP가 오류를 보내는 것처럼 보이지 않습니다. 그리고 빈 $ _POST 배열을 보냈기 때문에 스크립트가 빈 폼으로 되돌아가는 이유입니다. POST라고 생각하지 않습니다. (상당히 가난한 디자인 결정 IMHO)

    이 주석 작성자에게는 또한 흥미로운 아이디어가 있습니다.

  2. ==============================

    2.가장 큰 포스트 크기를 초과하는 파일을 잡거나 처리하는 방법이 있습니다. 이것은 최종 사용자에게 무슨 일이 일어 났으며 누가 잘못되었는지를 알려주므로 내 우선적으로 사용됩니다.)

    가장 큰 포스트 크기를 초과하는 파일을 잡거나 처리하는 방법이 있습니다. 이것은 최종 사용자에게 무슨 일이 일어 났으며 누가 잘못되었는지를 알려주므로 내 우선적으로 사용됩니다.)

        if(empty($_FILES) && empty($_POST) && isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) == 'post'){ //catch file overload error...
            $postMax = ini_get('post_max_size'); //grab the size limits...
            echo "<p style=\"color: #F00;\">\nPlease note files larger than {$postMax} will result in this error!<br>Please be advised this is not a limitation in the CMS, This is a limitation of the hosting server.<br>For various reasons they limit the max size of uploaded files, if you have access to the php ini file you can fix this by changing the post_max_size setting.<br> If you can't then please ask your host to increase the size limits, or use the FTP uploaded form</p>"; // echo out error and solutions...
            addForm(); //bounce back to the just filled out form.
    }
    elseif(// continue on with processing of the page...
    
  3. ==============================

    3.우리는 $ _POST 및 $ _FILES의 비어 있음 확인이 유효하지 않은 SOAP 요청에 대해 문제가 발생합니다. 유효한 요청에서 비어 있기 때문입니다.

    우리는 $ _POST 및 $ _FILES의 비어 있음 확인이 유효하지 않은 SOAP 요청에 대해 문제가 발생합니다. 유효한 요청에서 비어 있기 때문입니다.

    따라서 우리는 CONTENT_LENGTH와 post_max_size를 비교하여 점검을 구현했습니다. throw 된 예외는 나중에 등록 된 예외 처리기에서 XML-SOAP-FAULT로 변환됩니다.

    private function checkPostSizeExceeded() {
        $maxPostSize = $this->iniGetBytes('post_max_size');
    
        if ($_SERVER['CONTENT_LENGTH'] > $maxPostSize) {
            throw new Exception(
                sprintf('Max post size exceeded! Got %s bytes, but limit is %s bytes.',
                    $_SERVER['CONTENT_LENGTH'],
                    $maxPostSize
                )
            );
        }
    }
    
    private function iniGetBytes($val)
    {
        $val = trim(ini_get($val));
        if ($val != '') {
            $last = strtolower(
                $val{strlen($val) - 1}
            );
        } else {
            $last = '';
        }
        switch ($last) {
            // The 'G' modifier is available since PHP 5.1.0
            case 'g':
                $val *= 1024;
                // fall through
            case 'm':
                $val *= 1024;
                // fall through
            case 'k':
                $val *= 1024;
                // fall through
        }
    
        return $val;
    }
    
  4. ==============================

    4.@Matt McCormick과 @ AbdullahAJM의 답을 바탕으로, 테스트에 사용 된 변수가 설정되어 있는지 확인한 다음 $ _SERVER [ 'CONTENT_LENGTH']가 php_max_filesize 설정을 초과하는지 확인하는 PHP 테스트 케이스가 있습니다.

    @Matt McCormick과 @ AbdullahAJM의 답을 바탕으로, 테스트에 사용 된 변수가 설정되어 있는지 확인한 다음 $ _SERVER [ 'CONTENT_LENGTH']가 php_max_filesize 설정을 초과하는지 확인하는 PHP 테스트 케이스가 있습니다.

                if (
                    isset( $_SERVER['REQUEST_METHOD'] )      &&
                    ($_SERVER['REQUEST_METHOD'] === 'POST' ) &&
                    isset( $_SERVER['CONTENT_LENGTH'] )      &&
                    ( empty( $_POST ) )
                ) {
                    $max_post_size = ini_get('post_max_size');
                    $content_length = $_SERVER['CONTENT_LENGTH'] / 1024 / 1024;
                    if ($content_length > $max_post_size ) {
                        print "<div class='updated fade'>" .
                            sprintf(
                                __('It appears you tried to upload %d MiB of data but the PHP post_max_size is %d MiB.', 'csa-slplus'),
                                $content_length,
                                $max_post_size
                            ) .
                            '<br/>' .
                            __( 'Try increasing the post_max_size setting in your php.ini file.' , 'csa-slplus' ) .
                            '</div>';
                    }
                }
    
  5. ==============================

    5.이것은이 문제를 해결할 수있는 간단한 방법입니다.

    이것은이 문제를 해결할 수있는 간단한 방법입니다.

    코드 시작 부분에 "checkPostSizeExceeded"를 호출하면됩니다.

    function checkPostSizeExceeded() {
            if (isset($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] == 'POST' and
                isset($_SERVER['CONTENT_LENGTH']) and empty($_POST)//if is a post request and $_POST variable is empty(a symptom of "post max size error")
            ) {
                $max = get_ini_bytes('post_max_size');//get the limit of post size 
                $send = $_SERVER['CONTENT_LENGTH'];//get the sent post size
    
                if($max < $_SERVER['CONTENT_LENGTH'])//compare
                    throw new Exception(
                        'Max size exceeded! Were sent ' . 
                            number_format($send/(1024*1024), 2) . 'MB, but ' . number_format($max/(1024*1024), 2) . 'MB is the application limit.'
                        );
            }
        }
    

    이 보조 기능을 복사하십시오 :

    function get_ini_bytes($attr){
        $attr_value = trim(ini_get($attr));
    
        if ($attr_value != '') {
            $type_byte = strtolower(
                $attr_value{strlen($attr_value) - 1}
            );
        } else
            return $attr_value;
    
        switch ($type_byte) {
            case 'g': $attr_value *= 1024*1024*1024; break;
            case 'm': $attr_value *= 1024*1024; break;
            case 'k': $attr_value *= 1024; break;
        }
    
        return $attr_value;
    }
    
  6. from https://stackoverflow.com/questions/2133652/how-to-gracefully-handle-files-that-exceed-phps-post-max-size by cc-by-sa and MIT license