2015-11-11 2 views
2

Я сохраняю изображение на s3 и путь s3 к моей базе данных. Я вызываю путь, когда мне нужно показать изображение. Поэтому прямо сейчас у меня проблемы с изменением размера этого изображения, прежде чем сохранять его на s3. Я получаю сообщение об ошибке:Как изменить размер изображения с помощью вмешательства перед сохранением в s3?

Command (getRealPath) is not available for driver (Gd). 

это то, что мой контроллер выглядит

public function up(Request $request) { 

     $user = $request->user(); 
     $image= $request->file('images'); 

      if(!empty(($image))){ 
      $files = Input::file('images'); 
      foreach($files as $file) { 
      if(!empty($file)){ 



      $ext = $file->getClientOriginalExtension(); 

      $media = ($user->media->where('category','profile')->first()); 
      if($media == null){ 
       $media = new Media(); 
       $media->category='profile'; 
      }  
       $this->saveMedia($media, $user,$file); 
      } 
     } 
      return Redirect::back()->with('message','Your profile has been updated'); 
     } 
    } 
    private function saveMedia($media, $user, $file){ 

     $ext = $file->getClientOriginalExtension(); 
     $key = strtotime('now') . '.' . $ext;   
     $id = $user->id; 
     $url = 'https://s3-us-west-2.amazonaws.com/makersbrand/' . $id . '/' . $media->category . '/'; 
     $media->user_id = $user->id; 
     $media->path = $url . $key; 

     $this->fillMedia($media,$user,$file, $key); 
     $media->save(); 

    } 
    private function fillMedia($media, $user, $file, $key) 
    { 
     $file = Image::make($file)->resize(200,200); 
     $s3 = AWS::createClient('s3'); 
     $result = $s3->putObject(array(
      'Bucket' => self::$_BUCKET_NAME, 
      'Key' => $user->id . '/'. $media->category .'/'. $key, 
      'SourceFile' => $file->getRealPath(), 
      'Metadata' => array(
      'Owner' => $user->first_name .' ' . $user->last_name 
      ) 
      )); 
    } 

Update Я не думаю, что мои изображения даже получить изменения размера правильно, прежде чем она попадает на ошибку getClientOriginalExtension. Когда я делаю var_dump после изменения размера, я получаю этот текст:

object(Intervention\Image\Image)#238 (9) { ["driver":protected]=> 
object(Intervention\Image\Gd\Driver)#237 (2) { ["decoder"]=> 
object(Intervention\Image\Gd\Decoder)#241 (1) { 
["data":"Intervention\Image\AbstractDecoder":private]=> NULL } 
["encoder"]=> object(Intervention\Image\Gd\Encoder)#242 (4) { ["result"]=> 
NULL ["image"]=> NULL ["format"]=> NULL ["quality"]=> NULL } } 
["core":protected]=> resource(280) of type (gd) ["backups":protected]=> 
array(0) { } ["encoded"]=> string(0) "" ["mime"]=> string(10) "image/jpeg" 
["dirname"]=> string(26) "/Applications/MAMP/tmp/php" ["basename"]=> 
string(9) "phpVGzVk0" ["extension"]=> NULL ["filename"]=> string(9) 
"phpVGzVk0" } 

Результат: null. Формат равен NULL. изображение Null. Что я здесь делаю неправильно?

обновление Я переехал Изображение :: сделать для моей функции saveMedia. Теперь я получаю

Command (getRealPath) is not available for driver (Gd). 

ответ

1

Похоже, что водитель, который вы используете (Gd) не поддерживает конкретный метод (getClientOriginalExtension) единственное решение в вашем случае является использование функции PHP, чтобы получить расширение от имени файла:

$ ext = pathinfo ($ filePath, PATHINFO_EXTENSION);

+0

Мне просто нужно переместить изображение :: make под линией $ ext, и это работает. Но теперь я получаю ту же ошибку, кроме ее для getRealPath. Я использую это, чтобы сохранить изображение на amazon s3. Но я даже не вижу объект пути в моем файле $ после его изменения. – joejoeso

2

Для этой работы я использовал следующий код в своей кодовой базе Laravel 5;

$imageFile = \Image::make($uploadedFile)->resize(600, 600)->stream(); 
$imageFile = $imageFile->__toString(); 

$filename = 'aUniqueFilename.png'; 

$s3 = \Storage::disk('s3'); 
$s3->put('/'.$filename, $imageFile, 'public'); 
+0

Некоторые объяснения будут оценены. Что вы делаете с '$ imageFile -> __ toString()'? –

0

Основная ошибка здесь - вы передаете неверный объект (Intervention\Image\Image) вместо файла.

В вашем случае должно работать что-то вроде этого:

private function fillMedia($media, $user, $file, $key) 
{ 
    $image = Image::make($file)->resize(200,200); 
    $s3 = AWS::createClient('s3'); 
    $result = $s3->putObject(array(
     'Bucket' => self::$_BUCKET_NAME, 
     'Key' => $user->id . '/'. $media->category .'/'. $key, 

     // use 'Body' option to put resized image content instead of 'SourceFile' 
     // fyi, your resized image wasn't saved to the original file 
     'Body' => $image->__toString(), 
     'Metadata' => array(
      'Owner' => $user->first_name .' ' . $user->last_name 
     ) 
    )); 
} 
3

Эта причина ошибки по классу \ Intervention \ Image \ Image не поддерживает метод getRealPath()

Решение: создать класс-оболочку для реализовать getRealPath()

use \Intervention\Image\Image as InterventionImage; 

class ImageFile 
{ 
    /** 
    * Intervention image instance. 
    * 
    * @var \Intervention\Image\Image 
    */ 
    private $image; 

    function __construct(InterventionImage $image) 
    { 
     $this->image = $image; 
    } 

    function getRealPath() 
    { 
     return $this->image->basePath(); 
    } 

} 

Использование:

$image = new ImageFile(InterventionImage::make($file->path())->fit(300, 200)->save()); 

$s3Key = Storage::disk('s3')->putFileAs('my_s3_image_folder', $image, 'my_image_file_name.jpg', 'public'); 

// Save your s3 Key to your database or whatever... 
Смежные вопросы