2009-09-09 37 views

Trả lời

8

Có. Vì tệp ở xa, bạn hoàn toàn phụ thuộc vào giá trị của tiêu đề Content-Length (trừ khi bạn muốn tải xuống toàn bộ tệp). Bạn sẽ muốn curl_setopt($ch, CURLOPT_NOBODY, true)curl_setopt($ch, CURLOPT_HEADER, true).

10

Tôi đoán sử dụng curl để gửi yêu cầu HEAD là một khả năng tốt đẹp; một cái gì đó như thế này có lẽ sẽ làm:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

Và sẽ giúp bạn:

float 3438 

Bằng cách này, bạn đang sử dụng một yêu cầu HEAD, và không phải tải về toàn bộ tập tin - vẫn còn, bạn phụ thuộc vào máy chủ từ xa gửi tiêu đề Độ dài nội dung chính xác.


Một tùy chọn khác bạn có thể suy nghĩ về sẽ được sử dụng filesize ... Nhưng này sẽ thất bại: tài liệu khẳng định (trích dẫn):

Tính đến PHP 5.0.0, đây chức năng có thể cũng được sử dụng với một số trình bao bọc URL. Hãy tham khảo List of Supported Protocols/Wrappers để biết danh sách trong đó trình bao bọc hỗ trợ stat() họat động chức năng.

Và, thật không may, với HTTP and HTTPS wrappers, stat() không được hỗ trợ ...

Nếu bạn cố gắng, bạn sẽ nhận được một lỗi, như thế này:

Warning: filesize() [function.filesize]: stat failed 
    for http://sstatic.net/so/img/logo.png 

:-(Quá xấu

1

Sử dụng yêu cầu HEAD và kiểm tra Content-Length là cách tiêu chuẩn để thực hiện điều đó, nhưng bạn không thể dựa vào nó nói chung, vì máy chủ có thể không hỗ trợ.Tiêu đềlà tùy chọn và hơn nữa máy chủ có thể thậm chí không triển khai phương thức HEAD. Nếu bạn biết bạn đang thăm dò máy chủ nào, thì bạn có thể kiểm tra xem nó có hoạt động hay không, nhưng như một giải pháp chung, nó không phải là bằng chứng đạn.

+0

có, với điều này: http: // php. net/manual/en/function.get-headers.php – Merlinox

1

Nếu bạn không cần một giải pháp chống đạn, bạn có thể chỉ cần làm:

strlen(file_get_contents($url)); 
+4

Thao tác này sẽ hoạt động, nhưng nó cũng sẽ tải xuống tệp trước. Có lẽ, anh ta muốn biết kích thước trước khi lấy nó qua mạng. – troelskn

49

Giải pháp tốt nhất mà theo nguyên tắc KISS

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE)); 
$filesize = $head['content-length']; 
+8

Đến nay câu trả lời tốt nhất. Thực hiện tốt. –

+2

Lệnh này không trả lại một khóa 'chiều dài nội dung' cho tôi, đây là mảng nó trả về: ''kết nối' => chuỗi 'đóng' (length = 5) 'date' => string 'Tuệ, 03 Jun 2014 20:55:55 GMT '(length = 29) ' server '=> chuỗi' Microsoft-IIS/6.0 '(chiều dài = 17) ' x-powered-by '=> chuỗi' ASP.NET '(length = 7) ' x-aspnet-phiên bản '=> chuỗi' 4.0.30319 '(length = 9) ' bộ nhớ cache kiểm soát '=> chuỗi' riêng tư '(length = 7) ' loại nội dung '=> string' image/gif'' –

+2

Câu hỏi nhanh, tại sao nó cần array_change_key_case? – mario

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