Amazon S3 (Simple Storage Service) is a commercial storage web service offered by Amazon Web Services. It is inexpensive, scalable, responsive, and highly reliable. It has no minimum fee, and no start-up cost.
This code uses standard PHP sockets to send REST (HTTP 1.1) queries to Amazon S3 server. It does not support 'keep-alive' connections, so each call to downloadREST() function opens new connection to 's3.amazonaws.com'.
You should set following variables:
$aws_key — Your AWS Access Key ID
$aws_secret — Your AWS Secret Access Key
$aws_bucket — AWS bucket (directory) name. You must specify existing AWS bucket.
$aws_object — AWS object (file) name. You must specify existing AWS object.
See Amazon S3 Developer Guide for REST protocol details.
Using this code makes sense for objects uploaded with 'private' or 'authenticated-read' Amazon S3 ACL. You may download objects with other ACLs(public-read, public-read-write) by simply downloading file from URL:
http://s3.amazonaws.com/bucket_name/object_name
Where 'bucket_name' is AWS bucket name, and 'object_name' is AWS object name.
This code uses standard PHP sockets to send REST (HTTP 1.1) queries to Amazon S3 server. It does not support 'keep-alive' connections, so each call to downloadREST() function opens new connection to 's3.amazonaws.com'.
You should set following variables:
$aws_key — Your AWS Access Key ID
$aws_secret — Your AWS Secret Access Key
$aws_bucket — AWS bucket (directory) name. You must specify existing AWS bucket.
$aws_object — AWS object (file) name. You must specify existing AWS object.
<?php /* Online PHP Examples with Source Code website: http://4evertutorials.blogspot.in/ */ $aws_key = '_YOUR_AWS_KEY_000000'; $aws_secret = '_your_aws_secret_00000000000000000000000'; $aws_bucket = '4evertutorials'; // AWS bucket $aws_object = '4evertutorials.png'; // AWS object name (file name) if (strlen($aws_secret) != 40) die("$aws_secret should be exactly 40 bytes long"); $dt = gmdate('r'); // GMT based timestamp // preparing string to sign $string2sign = "GET {$dt} /{$aws_bucket}/{$aws_object}"; // preparing HTTP query $query = "GET /{$aws_bucket}/{$aws_object} HTTP/1.1 Host: s3.amazonaws.com Connection: close Date: {$dt} Authorization: AWS {$aws_key}:".amazon_hmac($string2sign)."\n\n"; echo "Downloading: http://s3.amazonaws.com/{$aws_bucket}/{$aws_object}\n"; list($header, $resp) = downloadREST($fp, $query); echo "\n\n"; if (strpos($header, '200 OK') === false) // checking for error die($header."\r\n\r\n".$resp); // response code is not 200 OK -- failure $aws_object_fs = str_replace('/', '_', $aws_object); // AWS object may contain slashes. We're replacing them with underscores @$fh = fopen($aws_object_fs, 'wb'); if ($fh == false) die("Can't open file {$aws_object_fs} for writing. Fatal error!\n"); echo "Saving data to {$aws_object_fs}...\n"; fwrite($fh, $resp); fclose($fh); // Sending HTTP query, without keep-alive support function downloadREST($fp, $q) { // opening HTTP connection to Amazon S3 // since there is no keep-alive we open new connection for each request $fp = fsockopen("s3.amazonaws.com", 80, $errno, $errstr, 30); if (!$fp) die("$errstr ($errno)\n"); // connection failed, pity fwrite($fp, $q); // sending queyr $r = ''; // buffer for result $check_header = true; // header check flag $header_end = 0; while (!feof($fp)) { $r .= fgets($fp, 256); // reading response if ($check_header) // checking for header { $header_end = strpos($r, "\r\n\r\n"); // this is HTTP header boundary if ($header_end !== false) $check_header = false; // We've found it, no more checking } } fclose($fp); $header_boundary = $header_end+4; // 4 is length of "\r\n\r\n" return array(substr($r, 0, $header_boundary), substr($r, $header_boundary)); // returning HTTP response header and retrieved data } // hmac-sha1 code START // hmac-sha1 function: assuming key is global $aws_secret 40 bytes long // read more at http://en.wikipedia.org/wiki/HMAC // warning: key($aws_secret) is padded to 64 bytes with 0x0 after first function call function amazon_hmac($stringToSign) { // helper function binsha1 for amazon_hmac (returns binary value of sha1 hash) if (!function_exists('binsha1')) { if (version_compare(phpversion(), "5.0.0", ">=")) { function binsha1($d) { return sha1($d, true); } } else { function binsha1($d) { return pack('H*', sha1($d)); } } } global $aws_secret; if (strlen($aws_secret) == 40) $aws_secret = $aws_secret.str_repeat(chr(0), 24); $ipad = str_repeat(chr(0x36), 64); $opad = str_repeat(chr(0x5c), 64); $hmac = binsha1(($aws_secret^$opad).binsha1(($aws_secret^$ipad).$stringToSign)); return base64_encode($hmac); } // hmac-sha1 code END ?>
See Amazon S3 Developer Guide for REST protocol details.
Using this code makes sense for objects uploaded with 'private' or 'authenticated-read' Amazon S3 ACL. You may download objects with other ACLs(public-read, public-read-write) by simply downloading file from URL:
http://s3.amazonaws.com/bucket_name/object_name
Where 'bucket_name' is AWS bucket name, and 'object_name' is AWS object name.
0 comments:
Post a Comment