2012-04-17 2 views
4

Я пытаюсь загрузить файл в свою корзину Amazon S3. У моего друга это работало на нашем сайте в прошлом, но через год его разорило, и я не могу понять, что случилось. Мы используем S3 PHP library, разработанный Geoff gaudreault.Как загрузить файл на amazon S3 с помощью Codeigniter/PHP?

Эта библиотека выглядит довольно простой для меня, действительно, похоже, что есть одна ключевая функция: putObject().

К сожалению, я даже не выхожу из ворот. Я получаю следующее сообщение об ошибке: Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data.

Вот мой CodeIgniter PHP для моей формы загрузки 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'; 
    } 
} 

Кто-нибудь есть какие-либо мысли?

+0

возможно дубликат [Error 324 пустого ответа на приложении, размещенные by AWS] (http://stackoverflow.com/questions/8861404/error-324-empty-response-on-application-hosted-by-aws) –

+0

привет, Колин, я не знаю, как получить доступ к моему S3-серверу из командной строки. Мой сервер EC2 /etc/apache2/error.log не упоминает об этой ошибке 324. мысли? –

+1

Прежде всего, вы можете использовать функциональные возможности в CodeIgniter для имени файла/пути и т. Д. Во-первых, вы можете использовать опцию 'encrypt_name' вместо генерации' $ newFileName' вручную. Во-вторых, '$ data ['full_path']' содержит полный путь к загруженному файлу, '$ data ['file_ext']' содержит расширение файла и, наконец, вместо использования '$ _SERVER ['DOCUMENT_ROOT']' вы должны просто используйте '$ config ['upload_path'] = './temp';' Скрипт загрузки принимает путь относительно index.php в вашем корне. HTH – Gavin

ответ

3

Я переключился на different S3 PHP library, который также называется S3.php, который является частью этого действительно приятного исходного кода учебника Netuts.

Просто подключив мои ключи AWS и имя ведра в файл page.php demo, я смог загрузить его в свое ведро, как через 2 минуты. Поэтому этот учебник очень прост. Очень волнующе!

+0

это используется для core php, а не для codeigniter framework –

+0

Этот вопрос (и этот ответ) слишком стар, у AWS есть новый sdk в своем репозитории https://github.com/aws/aws-sdk-php И легко устанавливается как библиотека в кодеригере через композитор или копирование sdk. – UselesssCat

0

Посетите эту ссылку это будет ПОЛЕЗНЫМ для вас https://github.com/jenssegers-deprecated/codeigniter-amazon-s3

+0

Ссылка на решение приветствуется, но, пожалуйста, убедитесь, что ваш ответ полезен без него: [добавить контекст вокруг ссылки] (// meta.stackexchange.com/a/8259), чтобы ваши друзья-пользователи имели представление о том, что это такое и почему он там, затем укажите наиболее релевантную часть страницы, на которую вы ссылаетесь, в случае недоступности целевой страницы. [Ответы, которые немного больше, чем ссылка, могут быть удалены.] (// stackoverflow.com/help/deleted-answers) – LW001

1

в CodeIgniter

Здесь увязывать с upload и delete изображений в s3 ведре

<?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; 
} 
Смежные вопросы