Welcome to Tech Support Forum home to more then 136,000 problems solved. Issues have included: Spyware, Malware, Virus Issues, Windows, Microsoft, Linux, Networking, Security, Hardware, and Gaming Getting your problem solved is as easy as:
1. Registering for a free account
2. Asking your question
3. Receiving an answer

Registered members:
* Get free support
* Communicate privately with other members (PM).
* Removal of this message
* See fewer ads.
* And much more..

 



Want to know how to post a question? click here Having problems with spyware and pop-ups? First Steps
Go Back   Tech Support Forum > Alternative Computing > Linux Support
User Name
Password
Site Map Register Donate Rules Blogs Mark Forums Read


Linux Support Linux - Operating Systems and Applications Support

Reply
 
LinkBack Thread Tools
Old 07-09-2009, 08:18 AM   #1 (permalink)
Registered User
 
Join Date: Jul 2009
Posts: 3
OS: XP


Confused I need Help in Apache and php..urgent pleas

hi !
i am new in Linux world ..my company have hosted the apache server on fedora 8...the web site is written in php... when we upload the pics to our server it uploads these pics to amazone/s3 with api....now we are facing a very serious issue that if we upload 70 pics to aur server then it start uploading to amazone
but after 40 or 50 images its stuck and we have to upload remaining pics again...i have edited the php.ini file and increase timeout.memory and uploading size but the problem is same...pleas help me in this how can i solve this issue
thanx in advance ...i have very limited time to answer my superiors....pleas
mansoorjaffery is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Important Information
Join the #1 Tech Support Forum Today - It's Totally Free!

TechSupportForum.com is a leading support website for your computer needs. We offer free, friendly and personalized computer support. Why pay to have your computer fixed when you can do it for free.

Join TechSupportforum.com Today - Click Here

Old 07-09-2009, 12:34 PM   #2 (permalink)
Moderator/Fedora Amb.
 
wmorri's Avatar
 
Join Date: May 2008
Location: /pm/etc
Posts: 2,814
OS: Window 7/Fedora 10

My System

Send a message via AIM to wmorri
Re: I need Help in Apache and php..urgent pleas

Hi,

Why do you have to load the pictures to your servers first? Can't you just upload the pictures to amazone/s3 server first. I am not seeing the point of the first upload if you could explain that it might help.

Cheers!
__________________


Linux Forever!

wmorri is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Old 07-11-2009, 10:53 AM   #3 (permalink)
Registered User
 
Join Date: Jul 2009
Posts: 3
OS: XP


Re: I need Help in Apache and php..urgent pleas

hi !
thanx "wmorri" for your contact..actually its a paid site for American school they upload there students pictures to our dedicated fedora server site and then its upload to amazone
hope fully it will clear your mind...pleas give me some solution
mansoorjaffery is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Old 07-11-2009, 11:33 AM   #4 (permalink)
Moderator/Fedora Amb.
 
wmorri's Avatar
 
Join Date: May 2008
Location: /pm/etc
Posts: 2,814
OS: Window 7/Fedora 10

My System

Send a message via AIM to wmorri
Re: I need Help in Apache and php..urgent pleas

Hi,

Thanks for the information, I am going to get a hold of some of the people in the web development forum and have them take a look at this. I am not too sure what to tell you I haven't had to re-work a webserver in quite a while.

Cheers!
__________________


Linux Forever!

wmorri is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Old 07-11-2009, 11:43 AM   #5 (permalink)
Design Team Member
 
jamiemac2005's Avatar
 
Join Date: Jul 2007
Location: Coventry, UK
Posts: 1,880
OS: Vista, various linux distros


Re: I need Help in Apache and php..urgent pleas

Hey, okay i need a little more info...

When uploading images what is the filesize? and do they upload one by one (request wize) or all at once?

Also you mention the PHP that uploads the pics, could you give us a coded example(or link) of the form and then PHP code that handles it?

Cheers,
Jamey
__________________

Myspace
jamiemac2005 is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Old 07-14-2009, 01:43 AM   #6 (permalink)
Registered User
 
Join Date: Jul 2009
Posts: 3
OS: XP


Re: I need Help in Apache and php..urgent pleas

the code to use upload images
PHP Code:
<?php
/**
* $Id: S3.php 43 2008-12-23 14:37:18Z don.schonknecht $
*
* Copyright (c) 2008, Donovan Schönknecht.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
*   this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
*/

/**
* Amazon S3 PHP class
*
* @link [url]http://undesigned.org.za/2007/10/22/amazon-s3-php-class[/url]
* @version 0.3.9
*/
class S3 {
    
// ACL flags
    
const ACL_PRIVATE 'private';
    const 
ACL_PUBLIC_READ 'public-read';
    const 
ACL_PUBLIC_READ_WRITE 'public-read-write';

    public static 
$useSSL true;

    private static 
$__accessKey// AWS Access key
    
private static $__secretKey// AWS Secret key


    /**
    * Constructor - if you're not using the class statically
    *
    * @param string $accessKey Access key
    * @param string $secretKey Secret key
    * @param boolean $useSSL Enable SSL
    * @return void
    */
    
public function __construct($accessKey null$secretKey null$useSSL true) {
        if (
$accessKey !== null && $secretKey !== null)
            
self::setAuth($accessKey$secretKey);
        
self::$useSSL $useSSL;
    }


    
/**
    * Set AWS access key and secret key
    *
    * @param string $accessKey Access key
    * @param string $secretKey Secret key
    * @return void
    */
    
public static function setAuth($accessKey$secretKey) {
        
self::$__accessKey $accessKey;
        
self::$__secretKey $secretKey;
    }


    
/**
    * Get a list of buckets
    *
    * @param boolean $detailed Returns detailed bucket list when true
    * @return array | false
    */
    
public static function listBuckets($detailed false) {
        
$rest = new S3Request('GET''''');
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::listBuckets(): [%s] %s"$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        
$results = array(); //var_dump($rest->body);
        
if (!isset($rest->body->Buckets)) return $results;

        if (
$detailed) {
            if (isset(
$rest->body->Owner$rest->body->Owner->ID$rest->body->Owner->DisplayName))
            
$results['owner'] = array(
                
'id' => (string)$rest->body->Owner->ID'name' => (string)$rest->body->Owner->ID
            
);
            
$results['buckets'] = array();
            foreach (
$rest->body->Buckets->Bucket as $b)
                
$results['buckets'][] = array(
                    
'name' => (string)$b->Name'time' => strtotime((string)$b->CreationDate)
                );
        } else
            foreach (
$rest->body->Buckets->Bucket as $b$results[] = (string)$b->Name;

        return 
$results;
    }


    
/*
    * Get contents for a bucket
    *
    * If maxKeys is null this method will loop through truncated result sets
    *
    * @param string $bucket Bucket name
    * @param string $prefix Prefix
    * @param string $marker Marker (last file listed)
    * @param string $maxKeys Max keys (maximum number of keys to return)
    * @param string $delimiter Delimiter
    * @param boolean $returnCommonPrefixes Set to true to return CommonPrefixes
    * @return array | false
    */
    
public static function getBucket($bucket$prefix null$marker null$maxKeys null$delimiter null$returnCommonPrefixes false) {
        
$rest = new S3Request('GET'$bucket'');
        if (
$prefix !== null && $prefix !== ''$rest->setParameter('prefix'$prefix);
        if (
$marker !== null && $marker !== ''$rest->setParameter('marker'$marker);
        if (
$maxKeys !== null && $maxKeys !== ''$rest->setParameter('max-keys'$maxKeys);
        if (
$delimiter !== null && $delimiter !== ''$rest->setParameter('delimiter'$delimiter);
        
$response $rest->getResponse();
        if (
$response->error === false && $response->code !== 200)
            
$response->error = array('code' => $response->code'message' => 'Unexpected HTTP status');
        if (
$response->error !== false) {
            
trigger_error(sprintf("S3::getBucket(): [%s] %s"$response->error['code'], $response->error['message']), E_USER_WARNING);
            return 
false;
        }

        
$results = array();

        
$nextMarker null;
        if (isset(
$response->body$response->body->Contents))
        foreach (
$response->body->Contents as $c) {
            
$results[(string)$c->Key] = array(
                
'name' => (string)$c->Key,
                
'time' => strtotime((string)$c->LastModified),
                
'size' => (int)$c->Size,
                
'hash' => substr((string)$c->ETag1, -1)
            );
            
$nextMarker = (string)$c->Key;
        }

        if (
$returnCommonPrefixes && isset($response->body$response->body->CommonPrefixes))
            foreach (
$response->body->CommonPrefixes as $c)
                
$results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix);

        if (isset(
$response->body$response->body->IsTruncated) &&
        (string)
$response->body->IsTruncated == 'false') return $results;

        if (isset(
$response->body$response->body->NextMarker))
            
$nextMarker = (string)$response->body->NextMarker;

        
// Loop through truncated results if maxKeys isn't specified
        
if ($maxKeys == null && $nextMarker !== null && (string)$response->body->IsTruncated == 'true')
        do {
            
$rest = new S3Request('GET'$bucket'');
            if (
$prefix !== null && $prefix !== ''$rest->setParameter('prefix'$prefix);
            
$rest->setParameter('marker'$nextMarker);
            if (
$delimiter !== null && $delimiter !== ''$rest->setParameter('delimiter'$delimiter);

            if ((
$response $rest->getResponse(true)) == false || $response->code !== 200) break;

            if (isset(
$response->body$response->body->Contents))
            foreach (
$response->body->Contents as $c) {
                
$results[(string)$c->Key] = array(
                    
'name' => (string)$c->Key,
                    
'time' => strtotime((string)$c->LastModified),
                    
'size' => (int)$c->Size,
                    
'hash' => substr((string)$c->ETag1, -1)
                );
                
$nextMarker = (string)$c->Key;
            }

            if (
$returnCommonPrefixes && isset($response->body$response->body->CommonPrefixes))
                foreach (
$response->body->CommonPrefixes as $c)
                    
$results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix);

            if (isset(
$response->body$response->body->NextMarker))
                
$nextMarker = (string)$response->body->NextMarker;

        } while (
$response !== false && (string)$response->body->IsTruncated == 'true');

        return 
$results;
    }


    
/**
    * Put a bucket
    *
    * @param string $bucket Bucket name
    * @param constant $acl ACL flag
    * @param string $location Set as "EU" to create buckets hosted in Europe
    * @return boolean
    */
    
public static function putBucket($bucket$acl self::ACL_PRIVATE$location false) {
        
$rest = new S3Request('PUT'$bucket'');
        
$rest->setAmzHeader('x-amz-acl'$acl);

        if (
$location !== false) {
            
$dom = new DOMDocument;
            
$createBucketConfiguration $dom->createElement('CreateBucketConfiguration');
            
$locationConstraint $dom->createElement('LocationConstraint'strtoupper($location));
            
$createBucketConfiguration->appendChild($locationConstraint);
            
$dom->appendChild($createBucketConfiguration);
            
$rest->data $dom->saveXML();
            
$rest->size strlen($rest->data);
            
$rest->setHeader('Content-Type''application/xml');
        }
        
$rest $rest->getResponse();

        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::putBucket({$bucket}, {$acl}, {$location}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Delete an empty bucket
    *
    * @param string $bucket Bucket name
    * @return boolean
    */
    
public static function deleteBucket($bucket) {
        
$rest = new S3Request('DELETE'$bucket);
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 204)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::deleteBucket({$bucket}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Create input info array for putObject()
    *
    * @param string $file Input file
    * @param mixed $md5sum Use MD5 hash (supply a string if you want to use your own)
    * @return array | false
    */
    
public static function inputFile($file$md5sum true) {
        if (!
file_exists($file) || !is_file($file) || !is_readable($file)) {
            
trigger_error('S3::inputFile(): Unable to open input file: '.$fileE_USER_WARNING);
            return 
false;
        }
        return array(
'file' => $file'size' => filesize($file),
        
'md5sum' => $md5sum !== false ? (is_string($md5sum) ? $md5sum :
        
base64_encode(md5_file($filetrue))) : '');
    }


    
/**
    * Create input array info for putObject() with a resource
    *
    * @param string $resource Input resource to read from
    * @param integer $bufferSize Input byte size
    * @param string $md5sum MD5 hash to send (optional)
    * @return array | false
    */
    
public static function inputResource(&$resource$bufferSize$md5sum '') {
        if (!
is_resource($resource) || $bufferSize <= 0) {
            
trigger_error('S3::inputResource(): Invalid resource or buffer size'E_USER_WARNING);
            return 
false;
        }
        
$input = array('size' => $bufferSize'md5sum' => $md5sum);
        
$input['fp'] =& $resource;
        return 
$input;
    }


    
/**
    * Put an object
    *
    * @param mixed $input Input data
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param constant $acl ACL constant
    * @param array $metaHeaders Array of x-amz-meta-* headers
    * @param array $requestHeaders Array of request headers or content type as a string
    * @return boolean
    */
    
public static function putObject($input$bucket$uri$acl self::ACL_PRIVATE$metaHeaders = array(), $requestHeaders = array()) {
        if (
$input == false) return false;
        
$rest = new S3Request('PUT'$bucket$uri);

        if (
is_string($input)) $input = array(
            
'data' => $input'size' => strlen($input),
            
'md5sum' => base64_encode(md5($inputtrue))
        );

        
// Data
        
if (isset($input['fp']))
            
$rest->fp =& $input['fp'];
        elseif (isset(
$input['file']))
            
$rest->fp = @fopen($input['file'], 'rb');
        elseif (isset(
$input['data']))
            
$rest->data $input['data'];

        
// Content-Length (required)
        
if (isset($input['size']) && $input['size'] > -1)
            
$rest->size $input['size'];
        else {
            if (isset(
$input['file']))
                
$rest->size filesize($input['file']);
            elseif (isset(
$input['data']))
                
$rest->size strlen($input['data']);
        }

        
// Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
        
if (is_array($requestHeaders))
            foreach (
$requestHeaders as $h => $v$rest->setHeader($h$v);
        elseif (
is_string($requestHeaders)) // Support for legacy contentType parameter
            
$input['type'] = $requestHeaders;

        
// Content-Type
        
if (!isset($input['type'])) {
            if (isset(
$requestHeaders['Content-Type']))
                
$input['type'] =& $requestHeaders['Content-Type'];
            elseif (isset(
$input['file']))
                
$input['type'] = self::__getMimeType($input['file']);
            else
                
$input['type'] = 'application/octet-stream';
        }

        
// We need to post with Content-Length and Content-Type, MD5 is optional
        
if ($rest->size && ($rest->fp !== false || $rest->data !== false)) {
            
$rest->setHeader('Content-Type'$input['type']);
            if (isset(
$input['md5sum'])) $rest->setHeader('Content-MD5'$input['md5sum']);

            
$rest->setAmzHeader('x-amz-acl'$acl);
            foreach (
$metaHeaders as $h => $v$rest->setAmzHeader('x-amz-meta-'.$h$v);
            
$rest->getResponse();
        } else
            
$rest->response->error = array('code' => 0'message' => 'Missing input parameters');

        if (
$rest->response->error === false && $rest->response->code !== 200)
            
$rest->response->error = array('code' => $rest->response->code'message' => 'Unexpected HTTP status');
        if (
$rest->response->error !== false) {
            
trigger_error(sprintf("S3::putObject(): [%s] %s"$rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Put an object from a file (legacy function)
    *
    * @param string $file Input file path
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param constant $acl ACL constant
    * @param array $metaHeaders Array of x-amz-meta-* headers
    * @param string $contentType Content type
    * @return boolean
    */
    
public static function putObjectFile($file$bucket$uri$acl self::ACL_PRIVATE$metaHeaders = array(), $contentType null) {
        return 
self::putObject(self::inputFile($file), $bucket$uri$acl$metaHeaders$contentType);
    }


    
/**
    * Put an object from a string (legacy function)
    *
    * @param string $string Input data
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param constant $acl ACL constant
    * @param array $metaHeaders Array of x-amz-meta-* headers
    * @param string $contentType Content type
    * @return boolean
    */
    
public static function putObjectString($string$bucket$uri$acl self::ACL_PRIVATE$metaHeaders = array(), $contentType 'text/plain') {
        return 
self::putObject($string$bucket$uri$acl$metaHeaders$contentType);
    }


    
/**
    * Get an object
    *
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param mixed $saveTo Filename or resource to write to
    * @return mixed
    */
    
public static function getObject($bucket$uri$saveTo false) {
        
$rest = new S3Request('GET'$bucket$uri);
        if (
$saveTo !== false) {
            if (
is_resource($saveTo))
                
$rest->fp =& $saveTo;
            else
                if ((
$rest->fp = @fopen($saveTo'wb')) !== false)
                    
$rest->file realpath($saveTo);
                else
                    
$rest->response->error = array('code' => 0'message' => 'Unable to open save file for writing: '.$saveTo);
        }
        if (
$rest->response->error === false$rest->getResponse();

        if (
$rest->response->error === false && $rest->response->code !== 200)
            
$rest->response->error = array('code' => $rest->response->code'message' => 'Unexpected HTTP status');
        if (
$rest->response->error !== false) {
            
trigger_error(sprintf("S3::getObject({$bucket}, {$uri}): [%s] %s",
            
$rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
$rest->response;
    }


    
/**
    * Get object information
    *
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param boolean $returnInfo Return response information
    * @return mixed | false
    */
    
public static function getObjectInfo($bucket$uri$returnInfo true) {
        
$rest = new S3Request('HEAD'$bucket$uri);
        
$rest $rest->getResponse();
        if (
$rest->error === false && ($rest->code !== 200 && $rest->code !== 404))
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::getObjectInfo({$bucket}, {$uri}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
$rest->code == 200 $returnInfo $rest->headers true false;
    }


    
/**
    * Copy an object
    *
    * @param string $bucket Source bucket name
    * @param string $uri Source object URI
    * @param string $bucket Destination bucket name
    * @param string $uri Destination object URI
    * @param constant $acl ACL constant
    * @return mixed | false
    */
    
public static function copyObject($srcBucket$srcUri$bucket$uri$acl self::ACL_PRIVATE) {
        
$rest = new S3Request('PUT'$bucket$uri);
        
$rest->setHeader('Content-Length'0);
        
$rest->setAmzHeader('x-amz-acl'$acl);
        
$rest->setAmzHeader('x-amz-copy-source'sprintf('/%s/%s'$srcBucket$srcUri));
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return isset(
$rest->body->LastModified$rest->body->ETag) ? array(
            
'time' => strtotime((string)$rest->body->LastModified),
            
'hash' => substr((string)$rest->body->ETag1, -1)
        ) : 
false;
    }


    
/**
    * Set logging for a bucket
    *
    * @param string $bucket Bucket name
    * @param string $targetBucket Target bucket (where logs are stored)
    * @param string $targetPrefix Log prefix (e,g; domain.com-)
    * @return boolean
    */
    
public static function setBucketLogging($bucket$targetBucket$targetPrefix null) {
        
// The S3 log delivery group has to be added to the target bucket's ACP
        
if ($targetBucket !== null && ($acp self::getAccessControlPolicy($targetBucket'')) !== false) {
            
// Only add permissions to the target bucket when they do not exist
            
$aclWriteSet false;
            
$aclReadSet false;
            foreach (
$acp['acl'] as $acl)
            if (
$acl['type'] == 'Group' && $acl['uri'] == 'http://acs.amazonaws.com/groups/s3/LogDelivery') {
                if (
$acl['permission'] == 'WRITE'$aclWriteSet true;
                elseif (
$acl['permission'] == 'READ_ACP'$aclReadSet true;
            }
            if (!
$aclWriteSet$acp['acl'][] = array(
                
'type' => 'Group''uri' => 'http://acs.amazonaws.com/groups/s3/LogDelivery''permission' => 'WRITE'
            
);
            if (!
$aclReadSet$acp['acl'][] = array(
                
'type' => 'Group''uri' => 'http://acs.amazonaws.com/groups/s3/LogDelivery''permission' => 'READ_ACP'
            
);
            if (!
$aclReadSet || !$aclWriteSetself::setAccessControlPolicy($targetBucket''$acp);
        }

        
$dom = new DOMDocument;
        
$bucketLoggingStatus $dom->createElement('BucketLoggingStatus');
        
$bucketLoggingStatus->setAttribute('xmlns''http://s3.amazonaws.com/doc/2006-03-01/');
        if (
$targetBucket !== null) {
            if (
$targetPrefix == null$targetPrefix $bucket '-';
            
$loggingEnabled $dom->createElement('LoggingEnabled');
            
$loggingEnabled->appendChild($dom->createElement('TargetBucket'$targetBucket));
            
$loggingEnabled->appendChild($dom->createElement('TargetPrefix'$targetPrefix));
            
// TODO: Add TargetGrants?
            
$bucketLoggingStatus->appendChild($loggingEnabled);
        }
        
$dom->appendChild($bucketLoggingStatus);

        
$rest = new S3Request('PUT'$bucket'');
        
$rest->setParameter('logging'null);
        
$rest->data $dom->saveXML();
        
$rest->size strlen($rest->data);
        
$rest->setHeader('Content-Type''application/xml');
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::setBucketLogging({$bucket}, {$uri}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Get logging status for a bucket
    *
    * This will return false if logging is not enabled.
    * Note: To enable logging, you also need to grant write access to the log group
    *
    * @param string $bucket Bucket name
    * @return array | false
    */
    
public static function getBucketLogging($bucket) {
        
$rest = new S3Request('GET'$bucket'');
        
$rest->setParameter('logging'null);
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::getBucketLogging({$bucket}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        if (!isset(
$rest->body->LoggingEnabled)) return false// No logging
        
return array(
            
'targetBucket' => (string)$rest->body->LoggingEnabled->TargetBucket,
            
'targetPrefix' => (string)$rest->body->LoggingEnabled->TargetPrefix,
        );
    }


    
/**
    * Disable bucket logging
    *
    * @param string $bucket Bucket name
    * @return boolean
    */
    
public static function disableBucketLogging($bucket) {
        return 
self::setBucketLogging($bucketnull);
    }


    
/**
    * Get a bucket's location
    *
    * @param string $bucket Bucket name
    * @return string | false
    */
    
public static function getBucketLocation($bucket) {
        
$rest = new S3Request('GET'$bucket'');
        
$rest->setParameter('location'null);
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::getBucketLocation({$bucket}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return (isset(
$rest->body[0]) && (string)$rest->body[0] !== '') ? (string)$rest->body[0] : 'US';
    }


    
/**
    * Set object or bucket Access Control Policy
    *
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param array $acp Access Control Policy Data (same as the data returned from getAccessControlPolicy)
    * @return boolean
    */
    
public static function setAccessControlPolicy($bucket$uri ''$acp = array()) {
        
$dom = new DOMDocument;
        
$dom->formatOutput true;
        
$accessControlPolicy $dom->createElement('AccessControlPolicy');
        
$accessControlList $dom->createElement('AccessControlList');

        
// It seems the owner has to be passed along too
        
$owner $dom->createElement('Owner');
        
$owner->appendChild($dom->createElement('ID'$acp['owner']['id']));
        
$owner->appendChild($dom->createElement('DisplayName'$acp['owner']['name']));
        
$accessControlPolicy->appendChild($owner);

        foreach (
$acp['acl'] as $g) {
            
$grant $dom->createElement('Grant');
            
$grantee $dom->createElement('Grantee');
            
$grantee->setAttribute('xmlns:xsi''http://www.w3.org/2001/XMLSchema-instance');
            if (isset(
$g['id'])) { // CanonicalUser (DisplayName is omitted)
                
$grantee->setAttribute('xsi:type''CanonicalUser');
                
$grantee->appendChild($dom->createElement('ID'$g['id']));
            } elseif (isset(
$g['email'])) { // AmazonCustomerByEmail
                
$grantee->setAttribute('xsi:type''AmazonCustomerByEmail');
                
$grantee->appendChild($dom->createElement('EmailAddress'$g['email']));
            } elseif (
$g['type'] == 'Group') { // Group
                
$grantee->setAttribute('xsi:type''Group');
                
$grantee->appendChild($dom->createElement('URI'$g['uri']));
            }
            
$grant->appendChild($grantee);
            
$grant->appendChild($dom->createElement('Permission'$g['permission']));
            
$accessControlList->appendChild($grant);
        }

        
$accessControlPolicy->appendChild($accessControlList);
        
$dom->appendChild($accessControlPolicy);

        
$rest = new S3Request('PUT'$bucket$uri);
        
$rest->setParameter('acl'null);
        
$rest->data $dom->saveXML();
        
$rest->size strlen($rest->data);
        
$rest->setHeader('Content-Type''application/xml');
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::setAccessControlPolicy({$bucket}, {$uri}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Get object or bucket Access Control Policy
    *
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @return mixed | false
    */
    
public static function getAccessControlPolicy($bucket$uri '') {
        
$rest = new S3Request('GET'$bucket$uri);
        
$rest->setParameter('acl'null);
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::getAccessControlPolicy({$bucket}, {$uri}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }

        
$acp = array();
        if (isset(
$rest->body->Owner$rest->body->Owner->ID$rest->body->Owner->DisplayName)) {
            
$acp['owner'] = array(
                
'id' => (string)$rest->body->Owner->ID'name' => (string)$rest->body->Owner->DisplayName
            
);
        }
        if (isset(
$rest->body->AccessControlList)) {
            
$acp['acl'] = array();
            foreach (
$rest->body->AccessControlList->Grant as $grant) {
                foreach (
$grant->Grantee as $grantee) {
                    if (isset(
$grantee->ID$grantee->DisplayName)) // CanonicalUser
                        
$acp['acl'][] = array(
                            
'type' => 'CanonicalUser',
                            
'id' => (string)$grantee->ID,
                            
'name' => (string)$grantee->DisplayName,
                            
'permission' => (string)$grant->Permission
                        
);
                    elseif (isset(
$grantee->EmailAddress)) // AmazonCustomerByEmail
                        
$acp['acl'][] = array(
                            
'type' => 'AmazonCustomerByEmail',
                            
'email' => (string)$grantee->EmailAddress,
                            
'permission' => (string)$grant->Permission
                        
);
                    elseif (isset(
$grantee->URI)) // Group
                        
$acp['acl'][] = array(
                            
'type' => 'Group',
                            
'uri' => (string)$grantee->URI,
                            
'permission' => (string)$grant->Permission
                        
);
                    else continue;
                }
            }
        }
        return 
$acp;
    }


    
/**
    * Delete an object
    *
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @return boolean
    */
    
public static function deleteObject($bucket$uri) {
        
$rest = new S3Request('DELETE'$bucket$uri);
        
$rest $rest->getResponse();
        if (
$rest->error === false && $rest->code !== 204)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::deleteObject(): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Get a query string authenticated URL
    *
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @param integer $lifetime Lifetime in seconds
    * @param boolean $hostBucket Use the bucket name as the hostname
    * @param boolean $https Use HTTPS ($hostBucket should be false for SSL verification)
    * @return string
    */
    
public static function getAuthenticatedURL($bucket$uri$lifetime$hostBucket false$https false) {
        
$expires time() + $lifetime;
        
$uri str_replace('%2F''/'rawurlencode($uri)); // URI should be encoded (thanks Sean O'Dea)
        
return sprintf(($https 'https' 'http').'://%s/%s?AWSAccessKeyId=%s&Expires=%u&Signature=%s',
        
$hostBucket $bucket $bucket.'.s3.amazonaws.com'$uriself::$__accessKey$expires,
        
urlencode(self::__getHash("GET\n\n\n{$expires}\n/{$bucket}/{$uri}")));
    }


    
/**
    * Create a CloudFront distribution
    *
    * @param string $bucket Bucket name
    * @param boolean $enabled Enabled (true/false)
    * @param array $cnames Array containing CNAME aliases
    * @param string $comment Use the bucket name as the hostname
    * @return array | false
    */
    
public static function createDistribution($bucket$enabled true$cnames = array(), $comment '') {
        
self::$useSSL true// CloudFront requires SSL
        
$rest = new S3Request('POST''''2008-06-30/distribution''cloudfront.amazonaws.com');
        
$rest->data self::__getCloudFrontDistributionConfigXML($bucket.'.s3.amazonaws.com'$enabled$comment, (string)microtime(true), $cnames);
        
$rest->size strlen($rest->data);
        
$rest->setHeader('Content-Type''application/xml');
        
$rest self::__getCloudFrontResponse($rest);

        if (
$rest->error === false && $rest->code !== 201)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::createDistribution({$bucket}, ".(int)$enabled.", '$comment'): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        } elseif (
$rest->body instanceof SimpleXMLElement)
            return 
self::__parseCloudFrontDistributionConfig($rest->body);
        return 
false;
    }


    
/**
    * Get CloudFront distribution info
    *
    * @param string $distributionId Distribution ID from listDistributions()
    * @return array | false
    */
    
public static function getDistribution($distributionId) {
        
self::$useSSL true// CloudFront requires SSL
        
$rest = new S3Request('GET''''2008-06-30/distribution/'.$distributionId'cloudfront.amazonaws.com');
        
$rest self::__getCloudFrontResponse($rest);

        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::getDistribution($distributionId): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        } elseif (
$rest->body instanceof SimpleXMLElement) {
            
$dist self::__parseCloudFrontDistributionConfig($rest->body);
            
$dist['hash'] = $rest->headers['hash'];
            return 
$dist;
        }
        return 
false;
    }


    
/**
    * Update a CloudFront distribution
    *
    * @param array $dist Distribution array info identical to output of getDistribution()
    * @return array | false
    */
    
public static function updateDistribution($dist) {
        
self::$useSSL true// CloudFront requires SSL
        
$rest = new S3Request('PUT''''2008-06-30/distribution/'.$dist['id'].'/config''cloudfront.amazonaws.com');
        
$rest->data self::__getCloudFrontDistributionConfigXML($dist['origin'], $dist['enabled'], $dist['comment'], $dist['callerReference'], $dist['cnames']);
        
$rest->size strlen($rest->data);
        
$rest->setHeader('If-Match'$dist['hash']);
        
$rest self::__getCloudFrontResponse($rest);

        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::updateDistribution({$dist['id']}, ".(int)$enabled.", '$comment'): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        } else {
            
$dist self::__parseCloudFrontDistributionConfig($rest->body);
            
$dist['hash'] = $rest->headers['hash'];
            return 
$dist;
        }
        return 
false;
    }


    
/**
    * Delete a CloudFront distribution
    *
    * @param array $dist Distribution array info identical to output of getDistribution()
    * @return boolean
    */
    
public static function deleteDistribution($dist) {
        
self::$useSSL true// CloudFront requires SSL
        
$rest = new S3Request('DELETE''''2008-06-30/distribution/'.$dist['id'], 'cloudfront.amazonaws.com');
        
$rest->setHeader('If-Match'$dist['hash']);
        
$rest self::__getCloudFrontResponse($rest);

        if (
$rest->error === false && $rest->code !== 204)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::deleteDistribution({$dist['id']}): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        }
        return 
true;
    }


    
/**
    * Get a list of CloudFront distributions
    *
    * @return array
    */
    
public static function listDistributions() {
        
self::$useSSL true// CloudFront requires SSL
        
$rest = new S3Request('GET''''2008-06-30/distribution''cloudfront.amazonaws.com');
        
$rest self::__getCloudFrontResponse($rest);

        if (
$rest->error === false && $rest->code !== 200)
            
$rest->error = array('code' => $rest->code'message' => 'Unexpected HTTP status');
        if (
$rest->error !== false) {
            
trigger_error(sprintf("S3::listDistributions(): [%s] %s",
            
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
            return 
false;
        } elseif (
$rest->body instanceof SimpleXMLElement && isset($rest->body->DistributionSummary)) {
            
$list = array();
            if (isset(
$rest->body->Marker$rest->body->MaxItems$rest->body->IsTruncated)) {
                
//$info['marker'] = (string)$rest->body->Marker;
                //$info['maxItems'] = (int)$rest->body->MaxItems;
                //$info['isTruncated'] = (string)$rest->body->IsTruncated == 'true' ? true : false;
            
}
            foreach (
$rest->body->DistributionSummary as $summary) {
                
$list[(string)$summary->Id] = self::__parseCloudFrontDistributionConfig($summary);
            }
            return 
$list;
        }
        return array();
    }


    
/**
    * Get a DistributionConfig DOMDocument
    *
    * @internal Used to create XML in createDistribution() and updateDistribution()
    * @param string $bucket Origin bucket
    * @param boolean $enabled Enabled (true/false)
    * @param string $comment Comment to append
    * @param string $callerReference Caller reference
    * @param array $cnames Array of CNAME aliases
    * @return string
    */
    
private static function __getCloudFrontDistributionConfigXML($bucket$enabled$comment$callerReference '0'$cnames = array()) {
        
$dom = new DOMDocument('1.0''UTF-8');
        
$dom->formatOutput true;
        
$distributionConfig $dom->createElement('DistributionConfig');
        
$distributionConfig->setAttribute('xmlns''http://cloudfront.amazonaws.com/doc/2008-06-30/');
        
$distributionConfig->appendChild($dom->createElement('Origin'$bucket));
        
$distributionConfig->appendChild($dom->createElement('CallerReference'$callerReference));
        foreach (
$cnames as $cname)
            
$distributionConfig->appendChild($dom->createElement('CNAME'$cname));
        if (
$comment !== ''$distributionConfig->appendChild($dom->createElement('Comment'$comment));
        
$distributionConfig->appendChild($dom->createElement('Enabled'$enabled 'true' 'false'));
        
$dom->appendChild($distributionConfig);
        return 
$dom->saveXML();
    }


    
/**
    * Parse a CloudFront distribution config
    *
    * @internal Used to parse the CloudFront DistributionConfig node to an array
    * @param object &$node DOMNode
    * @return array
    */
    
private static function __parseCloudFrontDistributionConfig(&$node) {
        
$dist = array();
        if (isset(
$node->Id$node->Status$node->LastModifiedTime$node->DomainName)) {
            
$dist['id'] = (string)$node->Id;
            
$dist['status'] = (string)$node->Status;
            
$dist['time'] = strtotime((string)$node->LastModifiedTime);
            
$dist['domain'] = (string)$node->DomainName;
        }
        if (isset(
$node->CallerReference))
            
$dist['callerReference'] = (string)$node->CallerReference;
        if (isset(
$node->Comment))
            
$dist['comment'] = (string)$node->Comment;
        if (isset(
$node->Enabled$node->Origin)) {
            
$dist['origin'] = (string)$node->Origin;
            
$dist['enabled'] = (string)$node->Enabled == 'true' true false;
        } elseif (isset(
$node->DistributionConfig)) {
            
$dist array_merge($distself::__parseCloudFrontDistributionConfig($node->DistributionConfig));
        }
        if (isset(
$node->CNAME)) {
            
$dist['cnames'] = array();
            foreach (
$node->CNAME as $cname$dist['cnames'][(string)$cname] = (string)$cname;
        }
        return 
$dist;
    }


    
/**
    * Grab CloudFront response
    *
    * @internal Used to parse the CloudFront S3Request::getResponse() output
    * @param object &$rest S3Request instance
    * @return object
    */
    
private static function __getCloudFrontResponse(&$rest) {
        
$rest->getResponse();
        if (
$rest->response->error === false && isset($rest->response->body) &&
        
is_string($rest->response->body) && substr($rest->response->body05) == '<?xml') {
            
$rest->response->body simplexml_load_string($rest->response->body);
            
// Grab CloudFront errors
            
if (isset($rest->response->body->Error$rest->response->body->Error->Code,
            
$rest->response->body->Error->Message)) {
                
$rest->response->error = array(
                    
'code' => (string)$rest->response->body->Error->Code,
                    
'message' => (string)$rest->response->body->Error->Message
                
);
                unset(
$rest->response->body);
            }
        }
        return 
$rest->response;
    }


    
/**
    * Get MIME type for file
    *
    * @internal Used to get mime types
    * @param string &$file File path
    * @return string
    */
    
public static function __getMimeType(&$file) {
        
$type false;
        
// Fileinfo documentation says fileinfo_open() will use the
        // MAGIC env var for the magic file
        
if (extension_loaded('fileinfo') && isset($_ENV['MAGIC']) &&
        (
$finfo finfo_open(FILEINFO_MIME$_ENV['MAGIC'])) !== false) {
            if ((
$type finfo_file($finfo$file)) !== false) {
                
// Remove the charset and grab the last content-type
                
$type explode(' 'str_replace('; charset='';charset='$type));
                
$type array_pop($type);
                
$type explode(';'$type);
                
$type trim(array_shift($type));
            }
            
finfo_close($finfo);

        
// If anyone is still using mime_content_type()
        
} elseif (function_exists('mime_content_type'))
            
$type trim(mime_content_type($file));

        if (
$type !== false && strlen($type) > 0) return $type;

        
// Otherwise do it the old fashioned way
        
static $exts = array(
            
'jpg' => 'image/jpeg''gif' => 'image/gif''png' => 'image/png',
            
'tif' => 'image/tiff''tiff' => 'image/tiff''ico' => 'image/x-icon',
            
'swf' => 'application/x-shockwave-flash''pdf' => 'application/pdf',
            
'zip' => 'application/zip''gz' => 'application/x-gzip',
            
'tar' => 'application/x-tar''bz' => 'application/x-bzip',
            
'bz2' => 'application/x-bzip2''txt' => 'text/plain',
            
'asc' => 'text/plain''htm' => 'text/html''html' => 'text/html',
            
'css' => 'text/css''js' => 'text/javascript',
            
'xml' => 'text/xml''xsl' => 'application/xsl+xml',
            
'ogg' => 'application/ogg''mp3' => 'audio/mpeg''wav' => 'audio/x-wav',
            
'avi' => 'video/x-msvideo''mpg' => 'video/mpeg''mpeg' => 'video/mpeg',
            
'mov' => 'video/quicktime''flv' => 'video/x-flv''php' => 'text/x-php'
        
);
        
$ext strtolower(pathInfo($filePATHINFO_EXTENSION));
        return isset(
$exts[$ext]) ? $exts[$ext] : 'application/octet-stream';
    }


    
/**
    * Generate the auth string: "AWS AccessKey:Signature"
    *
    * @internal Used by S3Request::getResponse()
    * @param string $string String to sign
    * @return string
    */
    
public static function __getSignature($string) {
        return 
'AWS '.self::$__accessKey.':'.self::__getHash($string);
    }


    
/**
    * Creates a HMAC-SHA1 hash
    *
    * This uses the hash extension if loaded
    *
    * @internal Used by __getSignature()
    * @param string $string String to sign
    * @return string
    */
    
private static function __getHash($string) {
        return 
base64_encode(extension_loaded('hash') ?
        
hash_hmac('sha1'$stringself::$__secretKeytrue) : pack('H*'sha1(
        (
str_pad(self::$__secretKey64chr(0x00)) ^ (str_repeat(chr(0x5c), 64))) .
        
pack('H*'sha1((str_pad(self::$__secretKey64chr(0x00)) ^
        (
str_repeat(chr(0x36), 64))) . $string)))));
    }

}

final class 
S3Request {
    private 
$verb$bucket$uri$resource ''$parameters = array(),
    
$amzHeaders = array(), $headers = array(
        
'Host' => '''Date' => '''Content-MD5' => '''Content-Type' => ''
    
);
    public 
$fp false$size 0$data false$response;


    
/**
    * Constructor
    *
    * @param string $verb Verb
    * @param string $bucket Bucket name
    * @param string $uri Object URI
    * @return mixed
    */
    
function __construct($verb$bucket ''$uri ''$defaultHost 's3.amazonaws.com') {
        
$this->verb $verb;
        
$this->bucket strtolower($bucket);
        
$this->uri $uri !== '' '/'.str_replace('%2F''/'rawurlencode($uri)) : '/';

        if (
$this->bucket !== '') {
            
$this->headers['Host'] = $this->bucket.'.'.$defaultHost;
            
$this->resource '/'.$this->bucket.$this->uri;
        } else {
            
$this->headers['Host'] = $defaultHost;
            
//$this->resource = strlen($this->uri) > 1 ? '/'.$this->bucket.$this->uri : $this->uri;
            
$this->resource $this->uri;
        }
        
$this->headers['Date'] = gmdate('D, d M Y H:i:s T');

        
$this->response = new STDClass;
        
$this->response->error false;
    }


    
/**
    * Set request parameter
    *
    * @param string $key Key
    * @param string $value Value
    * @return void
    */
    
public function setParameter($key$value) {
        
$this->parameters[$key] = $value;
    }


    
/**
    * Set request header
    *
    * @param string $key Key
    * @param string $value Value
    * @return void
    */
    
public function setHeader($key$value) {
        
$this->headers[$key] = $value;
    }


    
/**
    * Set x-amz-meta-* header
    *
    * @param string $key Key
    * @param string $value Value
    * @return void
    */
    
public function setAmzHeader($key$value) {
        
$this->amzHeaders[$key] = $value;
    }


    
/**
    * Get the S3 response
    *
    * @return object | false
    */
    
public function getResponse() {
        
$query '';
        if (
sizeof($this->parameters) > 0) {
            
$query substr($this->uri, -1) !== '?' '?' '&';
            foreach (
$this->parameters as $var => $value)
                if (
$value == null || $value == ''$query .= $var.'&';
                
// Parameters should be encoded (thanks Sean O'Dea)
                
else $query .= $var.'='.rawurlencode($value).'&';
            
$query substr($query0, -1);
            
$this->uri .= $query;

            if (
array_key_exists('acl'$this->parameters) ||
            
array_key_exists('location'$this->parameters) ||
            
array_key_exists('torrent'$this->parameters) ||
            
array_key_exists('logging'$this->parameters))
                
$this->resource .= $query;
        }
        
$url = ((S3::$useSSL && extension_loaded('openssl')) ?
        
'https://':'http://').$this->headers['Host'].$this->uri;
        
//var_dump($this->bucket, $this->uri, $this->resource, $url);

        // Basic setup
        
$curl curl_init();
        
curl_setopt($curlCURLOPT_USERAGENT'S3/php');

        if (
S3::$useSSL) {
            
curl_setopt($curlCURLOPT_SSL_VERIFYHOST1);
            
curl_setopt($curlCURLOPT_SSL_VERIFYPEER1);
        }

        
curl_setopt($curlCURLOPT_URL$url);

        
// Headers
        
$headers = array(); $amz = array();
        foreach (
$this->amzHeaders as $header => $value)
            if (
strlen($value) > 0$headers[] = $header.': '.$value;
        foreach (
$this->headers as $header => $value)
            if (
strlen($value) > 0$headers[] = $header.': '.$value;

        
// Collect AMZ headers for signature
        
foreach ($this->amzHeaders as $header => $value)
            if (
strlen($value) > 0$amz[] = strtolower($header).':'.$value;

        
// AMZ headers must be sorted
        
if (sizeof($amz) > 0) {
            
sort($amz);
            
$amz "\n".implode("\n"$amz);
        } else 
$amz '';

        
// Authorization string (CloudFront stringToSign should only contain a date)
        
$headers[] = 'Authorization: ' S3::__getSignature(
            
$this->headers['Host'] == 'cloudfront.amazonaws.com' $this->headers['Date'] :
            
$this->verb."\n".$this->headers['Content-MD5']."\n".
            
$this->headers['Content-Type']."\n".$this->headers['Date'].$amz."\n".$this->resource
        
);

        
curl_setopt($curlCURLOPT_HTTPHEADER$headers);
        
curl_setopt($curlCURLOPT_HEADERfalse);
        
curl_setopt($curlCURLOPT_RETURNTRANSFERfalse);
        
curl_setopt($curlCURLOPT_WRITEFUNCTION, array(&$this'__responseWriteCallback'));
        
curl_setopt($curlCURLOPT_HEADERFUNCTION, array(&$this'__responseHeaderCallback'));
        
curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);

        
// Request types
        
switch ($this->verb) {
            case 
'GET': break;
            case 
'PUT': case 'POST'// POST only used for CloudFront
                
if ($this->fp !== false) {
                    
curl_setopt($curlCURLOPT_PUTtrue);
                    
curl_setopt($curlCURLOPT_INFILE$this->fp);
                    if (
$this->size 0)
                        
curl_setopt($curlCURLOPT_INFILESIZE$this->size);
                } elseif (
$this->data !== false) {
                    
curl_setopt($curlCURLOPT_CUSTOMREQUEST$this->verb);
                    
curl_setopt($curlCURLOPT_POSTFIELDS$this->data);
                    if (
$this->size 0)
                        
curl_setopt($curlCURLOPT_BUFFERSIZE$this->size);
                } else
                    
curl_setopt($curlCURLOPT_CUSTOMREQUEST$this->verb);
            break;
            case 
'HEAD':
                
curl_setopt($curlCURLOPT_CUSTOMREQUEST'HEAD');
                
curl_setopt($curlCURLOPT_NOBODYtrue);
            break;
            case 
'DELETE':
                
curl_setopt($curlCURLOPT_CUSTOMREQUEST'DELETE');
            break;
            default: break;
        }

        
// Execute, grab errors
        
if (curl_exec($curl))
            
$this->response->code curl_getinfo($curlCURLINFO_HTTP_CODE);
        else
            
$this->response->error = array(
                
'code' => curl_errno($curl),
                
'message' => curl_error($curl),
                
'resource' => $this->resource
            
);

        @
curl_close($curl);

        
// Parse body into XML
        
if ($this->response->error === false && isset($this->response->headers['type']) &&
        
$this->response->headers['type'] == 'application/xml' && isset($this->response->body)) {
            
$this->response->body simplexml_load_string($this->response->body);

            
// Grab S3 errors
            
if (!in_array($this->response->code, array(200204)) &&
            isset(
$this->response->body->Code$this->response->body->Message)) {
                
$this->response->error = array(
                    
'code' => (string)$this->response->body->Code,
                    
'message' => (string)$this->response->body->Message
                
);
                if (isset(
$this->response->body->Resource))
                    
$this->response->error['resource'] = (string)$this->response->body->Resource;
                unset(
$this->response->body);
            }
        }

        
// Clean up file resources
        
if ($this->fp !== false && is_resource($this->fp)) fclose($this->fp);

        return 
$this->response;
    }


    
/**
    * CURL write callback
    *
    * @param resource &$curl CURL resource
    * @param string &$data Data
    * @return integer
    */
    
private function __responseWriteCallback(&$curl, &$data) {
        if (
$this->response->code == 200 && $this->fp !== false)
            return 
fwrite($this->fp$data);
        else
            
$this->response->body .= $data;
        return 
strlen($data);
    }


    
/**
    * CURL header callback
    *
    * @param resource &$curl CURL resource
    * @param string &$data Data
    * @return integer
    */
    
private function __responseHeaderCallback(&$curl, &$data) {
        if ((
$strlen strlen($data)) <= 2) return $strlen;
        if (
substr($data04) == 'HTTP')
            
$this->response->code = (int)substr($data93);
        else {
            list(
$header$value) = explode(': 'trim($data), 2);
            if (
$header == 'Last-Modified')
                
$this->response->headers['time'] = strtotime($value);
            elseif (
$header == 'Content-Length')
                
$this->response->headers['size'] = (int)$value;
            elseif (
$header == 'Content-Type')
                
$this->response->headers['type'] = $value;
            elseif (
$header == 'ETag')
                
$this->response->headers['hash'] = $value{0} == '"' substr($value1, -1) : $value;
            elseif (
preg_match('/^x-amz-meta-.*$/'$header))
                
$this->response->headers[$header] = is_numeric($value) ? (int)$value $value;
        }
        return 
$strlen;
    }

}





<?
    
$s3 null;
    
$s3 = new S3(awsAccessKeyawsSecretKey);  
    
    
$csv_db = new csv_session();
    
$csv_db->get_record_for_session_id($session_id);
    while(
$csv_db->move_next())
    {
        
$s3->putObjectFile(BULK_DATA.$school_id."-school/$session_id/$photo"$school_id.'-school'$photoS3::ACL_PUBLIC_READ_WRITE)) ;
    }
?>

Last edited by wmorri; 07-14-2009 at 08:27 AM.
mansoorjaffery is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Old 07-14-2009, 04:16 PM   #7 (permalink)
Design Team Member
 
Redcore's Avatar
 
Join Date: Aug 2007
Location: Jamestown, CA
Posts: 715
OS: Linux Mint 7

My System

Re: I need Help in Apache and php..urgent pleas

Amazon S3 is something I'm not familiar with at all (unfortunately). I'm still not entirely clear on your problem. Are the pictures uploading to your dedicated web server fine but not to Amazon S3? How are you uploading to your dedicated server (the above script appears to only be for Amazon S3)?

There may be a throttle/timeout for Amazon S3...if you have two scripts uploading simultaneously, that may increase the possibility for timeout. I'm not clear on why you need to upload to the web server if you have Amazon S3, but you could always create a script/job that checks one of the servers and transloads new files from one server to the other - then you don't have to have a script that uploads to both from the end user.
__________________
Free Resources
PC Protection - Comodo Firewall | AVG Anti-Virus | WinPatrol | Ad-Aware | Spybot S&D | SpywareBlaster |
Web Design/Programming - KompoZer
(Editor) | Paint.NET (Graphic) | GIMP+GIMPShop (Graphic) | FileZilla (FTP Client) | Free Hosting |
Redcore is offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit!
Reply With Quote
Reply


Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off




All times are GMT -7. The time now is 03:42 PM.



Copyright 2001 - 2009, Tech Support Forum
Home Tips Plus | Outdoor Basecamp | Automotive Support Forum

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85