我将图像保存到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
)
));
}
更新 我认为我的图像在遇到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" }
结果为空。格式为空。图像是空的。我在这里做错了什么?
更新 我将Image :: make移到了我的saveMedia函数中。现在我得到
Command (getRealPath) is not available for driver (Gd).
答案 0 :(得分:4)
此类错误由类\ 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...
答案 1 :(得分: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');
答案 2 :(得分:1)
您使用的驱动程序(gd)似乎不支持特定方法(getClientOriginalExtension),在您的情况下,唯一的解决方案是使用php函数从文件名中获取扩展名:
$ ext = pathinfo($ filePath,PATHINFO_EXTENSION);
答案 3 :(得分: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
)
));
}