How can I upload a file to amazon S3 with Codeigniter/PHP?

23,466

Solution 1

I switched to a different S3 PHP library, which is also referred to as S3.php, that is part of this really nice Netuts tutorial source code.

Just plugging in my AWS keys and bucket name into the demo's page.php file, I was able to upload to my bucket in like 2 minutes. So this tutorial is super easy. Very exciting!

Solution 2

in codeigniter

Here link to upload and delete image in s3 bucket

<?php

function profile_upload()
{
    //print_r($_FILES);
    if ($this->session->userdata('user_login')) {

        $file = $_FILES['agent_profile_file']['tmp_name'];

        if (file_exists($file)) {
            $allowedExts = array("gif", "jpeg", "jpg", "png");
            $typefile    = explode(".", $_FILES["agent_profile_file"]["name"]);
            $extension   = end($typefile);

            if (!in_array(strtolower($extension), $allowedExts)) {
                //not image
                $data['message'] = "images";
            } else {
                $userid = $this->session->userdata['user_login']['userid'];

                $full_path = "agent_image/" . $userid . "/profileImg/";

                /*if(!is_dir($full_path)){
                mkdir($full_path, 0777, true);
                }*/
                $path = $_FILES['agent_profile_file']['tmp_name'];

                $image_name = $full_path . preg_replace("/[^a-z0-9\._]+/", "-", strtolower(uniqid() . $_FILES['agent_profile_file']['name']));
                //move_uploaded_file($path,$image_name);

                $data['message'] = "sucess";

                $s3_bucket = s3_bucket_upload($path, $image_name);

                if ($s3_bucket['message'] == "sucess") {
                    $data['imagename'] = $s3_bucket['imagepath'];
                    $data['imagepath'] = $s3_bucket['imagename'];
                }

                //print_r($imagesizedata);
                //image
                //use $imagesizedata to get extra info
            }
        } else {
            //not file
            $data['message'] = "images";
        }

    } else {
        $data['message'] = "login";
    }
    echo json_encode($data);
    //$file_name2 = preg_replace("/ /", "-", $file_name);
}

// Helper file add code
// image compress code
function compress($source, $destination, $quality)
{
    ob_start();
    $info = getimagesize($source);

    if ($info['mime'] == 'image/jpeg') {
        $image = imagecreatefromjpeg($source);
    } elseif ($info['mime'] == 'image/gif') {
        $image = imagecreatefromgif($source);
    } elseif ($info['mime'] == 'image/png') {
        $image = imagecreatefrompng($source);
    }

    $filename = tempnam(sys_get_temp_dir(), "beyondbroker");

    imagejpeg($image, $filename, $quality);

    //ob_get_contents();
    $imagedata = ob_end_clean();
    return $filename;
}

// type for if image then it will reduce size
// site for it in web of mobile because mobile webservice image will in base 64
// $tempth will file temp path
// $image_path will file where to save path

function s3_bucket_upload($temppath, $image_path, $type = "image", $site = "web")
{
    $bucket = "bucket-name";

    $data = array();

    $data['message'] = "false";

    // For website only
    if ($site == "web") {
        if ($type == "image") {
            $file_Path = compress($temppath, $image_path, 90);
        } else {
            $file_Path = $temppath;
        }
    }

    try {
        $s3Client = new S3Client([
            'version'     => 'latest',
            'region'      => 'us-west-2',
            'credentials' => [
                'key'    => 'aws-key',
                'secret' => 'aws-secretkey',
            ],
        ]);

        // For website only
        if ($site == "web") {

            $result = $s3Client->putObject([
                'Bucket'     => $bucket,
                'Key'        => $image_path,
                'SourceFile' => $file_Path,
                //'body'=> $file_Path,
                'ACL'        => 'public-read',
                //'StorageClass' => 'REDUCED_REDUNDANCY',
            ]);

            $data['message']   = "sucess";
            $data['imagename'] = $image_path;
            $data['imagepath'] = $result['ObjectURL'];
        } else {
            // $tmp = base64_decode($base64);
            $upload            = $s3Client->upload($bucket, $image_path, $temppath, 'public-read');
            $data['message']   = "sucess";
            $data['imagepath'] = $upload->get('ObjectURL');
        }

    } catch (Exception $e) {
        $data['message'] = "false";
        // echo $e->getMessage() . "\n";
    }

    return $data;
}
Share:
23,466
tim peterson
Author by

tim peterson

web programming-javascript, php, mysql, css, html-is my thang

Updated on July 09, 2022

Comments

  • tim peterson
    tim peterson almost 2 years

    I'm trying to upload a file to my Amazon S3 bucket. My friend had this working on our site in the past but a year later its busted and I can't figure out what's wrong. We are using the S3 PHP library developed by Geoff gaudreault.

    This library looks pretty straightforward to me, really it looks like there is one key function: putObject().

    Unfortunately, I'm not even getting out of the gate. I'm getting the following error message: Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data.

    Here's my codeigniter PHP for my upload form action:

        function s3(){
    
        $config['upload_path'] = $_SERVER["DOCUMENT_ROOT"].'/temp/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = '1000000';
        $config['max_width']  = '1024000';
        $config['max_height']  = '768000';
    
        $this->load->library('upload', $config);
    
        if ( ! $this->upload->do_upload())
        {
            $error = array('error' => $this->upload->display_errors());
    
            print_r($error);
            echo 'failure';
        }
        else
        {
           $data = array('upload_data' => $this->upload->data()); 
            $fn = $data['file_name'];
            $type = substr($fn, strrpos($fn, '.') + 1);
    
        $this->load->library('s3');
        $temp_file_path = $_SERVER["DOCUMENT_ROOT"]."/temp/" . $data['file_name'];
        $contents = read_file($temp_file_path); // will this blow up or timeout for large files?! 
        $newFileName = uniqid().".".substr($temp_file_path, strrpos($temp_file_path, '.') + 1);
         $contentPath = "mysite.com/Images"; 
    
        $this->s3->putObject($newFileName, $contents, $contentPath, 'private', $type);
        echo 'success';
        }
    }
    

    Does anyone have any thoughts?

  • Anish Rai
    Anish Rai almost 7 years
    this is used for core php not for codeigniter framework
  • UselesssCat
    UselesssCat over 6 years
    this question (and this answer) is too old, AWS has a new sdk in its repository github.com/aws/aws-sdk-php And is easily installable as a library in codeigniter through composer or copying the sdk.