Easiest way to grab filesize of remote file in PHP?
Yes. Since the file is remote, you're completely dependent on the value of the Content-Length
header (unless you want to download the whole file). You'll want to curl_setopt($ch, CURLOPT_NOBODY, true)
and curl_setopt($ch, CURLOPT_HEADER, true)
.
Get size of a remote file
If the site redirects via. the Location header you can use:
// get the redirect url
$headers = get_headers("http://somedomain.com/files/34", 1);
$redirectUrl = $headers['Location'];
// get the filesize
$headers = get_headers($redirectUrl, 1);
$filesize = $headers["Content-Length"];
Please note that this code should not be used in production as there are no checks for existing array keys or error handling.
Get remote file size using URL in PHP
You can use curl_getinfo()
function to get the remote file size.
$ch = curl_init('http://www.google.co.in/images/srpr/logo4w.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
$data = curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($ch);
echo $size;
Remote file size without downloading file
Found something about this here:
Here's the best way (that I've found) to get the size of a remote
file. Note that HEAD requests don't get the actual body of the request,
they just retrieve the headers. So making a HEAD request to a resource
that is 100MB will take the same amount of time as a HEAD request to a
resource that is 1KB.
<?php
/**
* Returns the size of a file without downloading it, or -1 if the file
* size could not be determined.
*
* @param $url - The location of the remote file to download. Cannot
* be null or empty.
*
* @return The size of the file referenced by $url, or -1 if the size
* could not be determined.
*/
function curl_get_file_size( $url ) {
// Assume failure.
$result = -1;
$curl = curl_init( $url );
// Issue a HEAD request and follow any redirects.
curl_setopt( $curl, CURLOPT_NOBODY, true );
curl_setopt( $curl, CURLOPT_HEADER, true );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_USERAGENT, get_user_agent_string() );
$data = curl_exec( $curl );
curl_close( $curl );
if( $data ) {
$content_length = "unknown";
$status = "unknown";
if( preg_match( "/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches ) ) {
$status = (int)$matches[1];
}
if( preg_match( "/Content-Length: (\d+)/", $data, $matches ) ) {
$content_length = (int)$matches[1];
}
// http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
if( $status == 200 || ($status > 300 && $status <= 308) ) {
$result = $content_length;
}
}
return $result;
}
?>
Usage:
$file_size = curl_get_file_size( "http://stackoverflow.com/questions/2602612/php-remote-file-size-without-downloading-file" );
Get remote file size from HTTPS url
You need to add the below cURL
parameter to your existing set.
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, 0);
- Adding this will stop
cURL
from verifying the peer's certificate.
How to get the file size of a remotely stored image? (php)
Assuming you're worried about the size of the file (not the dimensions of the image), you can grab Content-Length and it will usually work.
If the server on the other end does't supply the header, you'll have no choice but to GET the file, and check its size locally.
<?PHP
$headers = get_headers('http://humus101.com/wp-content/uploads/2009/11/Hummus-soup.jpg');
$size = null;
foreach($headers as $h){
/** look for Content-Length, and stick it in $size **/
}
if ($size === null){ //we didn't get a Content-Length header
/** Grab file to local disk and use filesize() to set $size **/
}
echo "image is $size bytes";
Remote file size with curl
First result on Google, http://www.php.net/manual/en/function.filesize.php#92462. SOF is not a replacement for Google.
This will only work if the remote host is supplying valid content header, namely Content-Length
. You cannot otherwise get file size without actually downloading it first.
<?php
$remoteFile = 'http://us.php.net/get/php-5.2.10.tar.bz2/from/this/mirror';
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
echo 'cURL failed';
exit;
}
$contentLength = 'unknown';
$status = 'unknown';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
$status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
}
echo 'HTTP Status: ' . $status . "\n";
echo 'Content-Length: ' . $contentLength;
?>
Related Topics
Php's Function to List All Objects's Properties and Methods
PHP Regex Get Text Between Bbcode Tags
Is There a Difference Between Instantiation with Parentheses or Without
Troubleshooting "Unexpected T_Echo" in Ternary Operator Statement
How to Use Date() in Doctrine 2 Dql
PHP Variable Variables with Array Key
Convert This String to Timestamp PHP
PHP Preg-Replace More Than One Underscore
Iterating Through a Stdclass Object in PHP
Find and Replace Keywords by Hyperlinks in an HTML Fragment, via PHP Dom
Prevent Browser Back Button Cache
How to Render Content from String/Database with Twig