2012-07-31 21 views
9

Tôi khá ngạc nhiên khi tìm thấy lỗi được đề cập ở trên trong nhật ký lỗi của mình vì tôi nghĩ mình đã thực hiện công việc cần thiết bắt lỗi trong script PHP của tôi:PHP Cảnh báo: POST Nội dung Độ dài của n byte vượt quá giới hạn 3145728 byte trong Không xác định trên dòng 0

if ($_FILES['image']['error'] == 0) 
{ 
// go ahead to process the image file 
} 
else 
{ 
// determine the error 
switch($_FILES['image']['error']) 
{ 
    case "1": 
    $msg = "Uploaded file exceeds the upload_max_filesize directive in php.ini."; 
    break; 
    .... 
} 
} 

trong kịch bản php.ini của tôi, các thiết lập liên quan là:

memory_limit = 128M 
post_max_size = 3M 
upload_max_filesize = 500K 

tôi hiểu rằng 3M tương đương với 3.145.728 byte và rằng đây là những gì mà đang kích hoạt lỗi. Nếu kích thước tệp ở trên 500k nhưng nhỏ hơn 3M, tập lệnh PHP sẽ có thể chạy như bình thường, phát hành thông báo lỗi trong $msg theo case 1.

Làm cách nào để bắt lỗi này thay vì cho phép tập lệnh chấm dứt đột ngột bằng cảnh báo PHP khi kích thước bài đăng vượt quá post_max_size nhưng vẫn còn trong giới hạn bộ nhớ? Tôi đã xem các câu hỏi tương tự here, herehere, nhưng không thể tìm thấy câu trả lời.

+0

Tại sao bạn không bọc chức năng của mình trong khối 'try..catch'? – inhan

+0

'error_reporting (E_ALL & ~ E_WARNING);' để tắt cảnh báo PHP. – fdomig

+0

@fdomig Đó phải là phương sách cuối cùng tuyệt đối. –

Trả lời

14

Tìm thấy một giải pháp thay thế mà không đối phó với các lỗi trực tiếp. Các mã sau đây được viết bởi một kỹ sư phần mềm Andrew Curioso trong blog mình:

if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && 
    empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0) 
{ 
    $displayMaxSize = ini_get('post_max_size'); 

    switch(substr($displayMaxSize,-1)) 
    { 
    case 'G': 
     $displayMaxSize = $displayMaxSize * 1024; 
    case 'M': 
     $displayMaxSize = $displayMaxSize * 1024; 
    case 'K': 
     $displayMaxSize = $displayMaxSize * 1024; 
    } 

    $error = 'Posted data is too large. '. 
      $_SERVER[CONTENT_LENGTH]. 
      ' bytes exceeds the maximum size of '. 
      $displayMaxSize.' bytes.'; 
} 

Như đã giải thích trong bài viết của mình, khi kích thước bài vượt quá post_max_size, các mảng siêu toàn cầu của $_POST$_FILES sẽ trở nên trống rỗng. Vì vậy, bằng cách kiểm tra những điều này và bằng cách xác nhận rằng có một số nội dung được gửi bằng phương thức POST, có thể suy luận rằng một lỗi như vậy đã xảy ra.

Có thực sự là một câu hỏi tương tự here mà tôi không tìm thấy trước đó.

1

Bạn có thể kiểm tra bằng javascript trước khi quá trình tải lên diễn ra?

// Assumed input for file in your HTML 
<input type="file" id="myFile" /> 


//binds to onchange event of your input field 
$('#myFile').bind('change', function() { 
    alert(this.files[0].size); 
}); 

Bạn cũng có thể bật một catch xung quanh nó:

try 
{ 
    if (!move_uploaded_file('blah blah')) 
    { 
     throw new Exception('Too damn big.'); 
    } 
    // Can do your other error checking here... 
    echo "Upload Complete!"; 
} 
catch (Exception $e) 
{ 
    die ('File did not upload: ' . $e->getMessage()); 
} 
+1

Người dùng có thể không bật javascript. –

+0

+1 điều này có thể không giải quyết được hoàn toàn vấn đề, nhưng là một gợi ý tốt. – Rab

+0

@QuestionOverflow Mặc dù đúng, nhưng cơ hội xảy ra là 1 trong một triệu như tất cả mọi thứ ngày nay cần JS để được kích hoạt. Sẽ rất khó khăn để tìm một ai đó với JS của họ bị vô hiệu hóa – asprin

Các vấn đề liên quan