2011-10-21 28 views
31

Tôi gặp sự cố sau, tôi có biểu mẫu HTML tải lên tệp có thêm một số thông tin. Nhưng nó cho phép để tải lên các tập tin mà chỉ ít hơn 10MB. Nhưng khi người dùng cố gắng tải lên thứ gì đó lớn hơn, cả mảng $ _POST và $ _FILES đều trống (tôi dự kiến ​​$ _POST sẽ có một số giá trị và $ _FILES sẽ có một số giá trị nhưng sẽ cho biết có lỗi tải lên).

Có một số câu hỏi (rỗng $ _POST, $ _FILES) như thế, nhưng tôi không tìm thấy giải pháp nào hoặc giải thích cho nó.

dạng HTML:

<form enctype="multipart/form-data" method="post" action="upload.php"> 
    <p> 
     <input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> 
     <input type="file" name="image" /> 
    </p> 
    <p> 
     <input type="text" name="other_field" /> 
    </p> 
</form> 

upload.php

print_r($_POST); // array() 
print_r($_FILES); // array() 
exit; 

Nó hoạt động tốt, nếu kích thước tập tin là dưới 10MB (file giới hạn kích thước là 10MB), và tôi không muốn tăng nó, tôi chỉ muốn nắm bắt một lỗi trong PHP.

Cập nhật (lời giải thích/giải pháp) từ PHP trang web

Từ trang web PHP (tôi đã bỏ lỡ phần này): http://us.php.net/manual/en/ini.core.php#ini.post-max-size

Sets kích thước tối đa của bài dữ liệu cho phép. Cài đặt này cũng ảnh hưởng đến việc tải lên tệp. Để tải lên các tệp lớn, giá trị này phải lớn hơn upload_max_filesize. Nếu giới hạn bộ nhớ được kích hoạt bởi tập lệnh cấu hình của bạn, memory_limit cũng ảnh hưởng đến việc tải lên tệp. Nói chung, memory_limit phải lớn hơn post_max_size. Khi một số nguyên được sử dụng, giá trị được tính theo byte. Ký hiệu viết tắt, như được mô tả trong Câu hỏi thường gặp này, cũng có thể được sử dụng. Nếu kích thước của dữ liệu bài đăng lớn hơn post_max_size, các superglobals $ _POST và $ _FILES trống. Điều này có thể được theo dõi theo nhiều cách khác nhau, ví dụ: bằng cách chuyển biến $ _GET tới tập lệnh xử lý dữ liệu, nghĩa là, và sau đó kiểm tra xem $ _GET ['processed'] có được đặt hay không.

+1

Bạn đã đọc http://php.net/manual/en/features.file-upload.php? –

+2

vâng, nhưng có lẽ tôi đã bỏ lỡ điều gì đó ở đó. Cả hai mảng $ _FILES và $ _POST đều trống trong trường hợp này, và có vẻ như chúng sẽ cung cấp cho bạn một mã lỗi. –

Trả lời

28

Như đã nêu trong câu hỏi đã chỉnh sửa $ _POST và $ _FILES trống khi PHP âm thầm loại bỏ dữ liệu (xảy ra khi dữ liệu thực tế lớn hơn post_max_size). Vì tiêu đề HTTP và $ _GET vẫn còn nguyên vẹn, chúng có thể được sử dụng để phát hiện các loại bỏ.

Lựa chọn một)

if(intval($_SERVER['CONTENT_LENGTH'])>0 && count($_POST)===0){ 
    throw new Exception('PHP discarded POST data because of request exceeding post_max_size.'); 
} 

Lựa chọn b)
Thêm một tham số GET mà nói cho dù POST dữ liệu hiện diện.

+0

+1 cho "ném ngoại lệ" – evilReiko

+1

Lưu ý: $ _SERVER ['CONTENT_LENGTH'] không phải là "luôn luôn" được đặt, máy chủ lưu trữ có thể tắt biến này hiển thị – evilReiko

+1

Cảm ơn, đây là câu trả lời! – brentonstrine

0

Có một số giới hạn - cả ở phía máy khách và phía máy chủ.

Về phía khách hàng, trường MAX_FILE_SIZE không được sử dụng nhiều, có thể trình duyệt có thể coi đó là gợi ý; nhưng thay vào đó các trình duyệt tuân theo giới hạn được định cấu hình của chúng.

Về phía server, kiểm tra php.ini cho:

upload_max_filesize = 5M 

post_max_size = 5M 

max_input_time = ... 

Ngoài ra kiểm tra log của Apache cho các ghi chú về cơ thể POST rơi hoặc như vậy.

+0

vâng, tôi biết có giới hạn, nhưng không nên đưa ra lỗi khi đạt tới giới hạn đó? –

+0

http://php.net/manual/en/features.file-upload.errors.php – Crontab

11

Chạy phpinfo() và kiểm tra để đảm bảo chỉ thị upload_max_filesizepost_max_size của bạn đủ lớn.

http://us.php.net/manual/en/ini.core.php#ini.upload-max-filesize

http://us.php.net/manual/en/ini.core.php#ini.post-max-size

+1

Điều này không giải quyết được câu hỏi tại sao '$ _POST' trống. Nếu có lỗi với kích thước tệp, bạn sẽ nhận được thông báo lỗi, không phải là một '$ _POST' trống. – brentonstrine

+0

@brentonstrine Bạn có ** nghiêm túc ** necro'ing một bài đăng từ tháng mười năm 2011 - gần ba năm trước - để khiếu nại về một câu trả lời và downvote? OP đã cố gửi các tệp lớn hơn 'post_max_size' của họ. Điều này, đến lượt nó (đọc OP), làm cho '$ _POST' và' $ _FILES' rỗng. – Crontab

+3

Mục đích không phải là để phàn nàn - mặc dù tôi thấy nó như thế nào. Câu trả lời của bạn đã được bình chọn cao hơn câu trả lời của Augustus, nhiều hơn bạn để giải thích vấn đề là gì và thậm chí cung cấp một giải pháp để phát hiện khi '$ _POST' trống vì nó vượt quá mức tối đa. Tôi upvoted của mình và downvoted của bạn để câu trả lời của ông sẽ là đầu tiên, vì nó hữu ích hơn. Nhận xét này chỉ có ý nghĩa như một lời giải thích cho downvote. Mặc dù vậy, tôi vẫn đứng trước nhược điểm: thông tin quan trọng là * tại sao * '$ _POST' sẽ trống. – brentonstrine

-1

Bạn có thể kiểm tra lỗi upload với:

if ($_FILES['images']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['images']['error']); 
} 

Các mã lỗi được định nghĩa here.

+2

Anh ấy nói '$ _FILES' trống. Không thể kiểm tra những gì không tồn tại. – mpen

1

tôi có thể đề cập rằng nếu bạn xử lý hình thức như dưới đây

if(isset($_POST['submit']) 

nếu post_max_size là thấp hơn so với dữ liệu đăng tải thì $ _POST [ 'submit'] sẽ trống

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