2009-09-01 41 views

Trả lời

4

Dự đoán của tôi là ở số $_SERVER['CONTENT_LENGTH'].

Và nếu bạn cần điều đó để phát hiện lỗi, hãy xem $_FILES['filename']['error'].

+0

Tôi đang tải lên các tệp lớn trên máy chủ cùng với các trường khác. Nhưng nếu tôi hủy bỏ một phần yêu cầu sẽ bị thiếu, vì vậy tôi cần phải so sánh kích thước thực tế của phần thân yêu cầu với giá trị từ tiêu đề Content-Length để đảm bảo việc tải lên tệp không bị hủy. –

+0

'$ _SERVER ['CONTENT_LENGTH']' tất nhiên chứa giá trị từ tiêu đề. Tôi nghĩ rằng đó là trách nhiệm của PHP để đảm bảo nó tuân thủ các dữ liệu thực tế đang được nhận. Có thể '$ _FILES ['file'] ['error']' có một số gợi ý cho nó? –

+0

Nếu bạn đang cố gắng phát hiện các tệp tải lên không thành công, bạn nên làm theo cách nó được hiển thị trong bài đăng của tôi, không tính byte. –

0

Tôi đoán bạn đang tìm kiếm $HTTP_RAW_POST_DATA

+0

Hmm ... Nhưng bạn không cần dữ liệu để biết kích thước của nó, phải không? –

+0

Cảm ơn, nhưng $ HTTP_RAW_POST_DATA không khả dụng với enctype = "multipart/form-data". Tôi cần sử dụng multipart/form-data để gửi các tập tin. –

+0

** Cảnh báo ** Tính năng này được DEPRECATED trong PHP 5.6.0, và REMOVED là của PHP 7.0.0. [PHP Link] (http://php.net/manual/en/reserved.variables.httprawpostdata.php) –

4

Nếu bạn đang cố gắng tìm ra hay không upload tập tin thất bại, bạn nên sử dụng các xử lý như thể hiện tại liên kết dưới đây lỗi file PHP. Đây là cách đáng tin cậy nhất để phát hiện lỗi tệp tải lên:
http://us3.php.net/manual/en/features.file-upload.errors.php

Nếu bạn cần kích thước của một yêu cầu POST mà không cần bất kỳ tập tin tải lên, bạn sẽ có thể làm như vậy với một cái gì đó như thế này:

$request = http_build_query($_POST); 
$size = strlen($request); 
+0

nếu không, nếu anh ta 'chỉ' muốn kích thước, bạn có thể lấy nó cho một tệp bằng cách sử dụng mảng $ _FILES => $ _FILES ['nameoffile'] ['size'] – Jakub

2

này có thể làm việc:

$bytesInPostRequestBody = strlen(file_get_contents('php://input')); 
// This does not count the bytes of the request's headers on its body. 
+0

Trước PHP5.6 hành động này có thể xóa luồng khiến nó chỉ được phép đọc nó một lần: [docs] (http://php.net/manual/en/wrappers .php.php). Vì vậy, bạn sẽ thấy chiều dài của nó nhưng sau đó nó sẽ trống rỗng – vladkras

30

đơn giản như:

$size = (int) $_SERVER['CONTENT_LENGTH']; 

Lưu ý rằng $ _SERVER ['CONTENT_LENGTH'] chỉ được đặt trong Yêu cầu HTTP thông qua phương thức POST. Đây là giá trị thô của tiêu đề Content-Length. Xem: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13

Trong trường hợp tải lên tệp, nếu bạn muốn nhận được tổng kích thước của các tệp được tải lên, bạn nên lặp qua các phần tử $ _FILE để tổng hợp mỗi tệp $ ['size']. Tổng kích thước chính xác không khớp với giá trị Độ dài nội dung thô do chi phí mã hóa của dữ liệu POST.

Cũng lưu ý rằng đối với lỗi tệp, bạn nên kiểm tra mã $ file ['error'] của mỗi phần tử $ _FILES. Ví dụ: tải lên một phần sẽ trả về lỗi UPLOAD_ERR_PARTIAL và các video tải lên trống sẽ trả lại UPLOAD_ERR_NO_FILE. Xem tài liệu về lỗi tải tệp lên trong hướng dẫn sử dụng PHP.

+1

$ size = (int) $ _SERVER ['CONTENT_LENGTH']; Điều đó có cung cấp kích thước theo đơn vị byte không? – anujeet

+0

không được chấp nhận ... $ _SERVER ['argv'] – ina

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