2017-07-31 56 views
0

我创建了用于上传图片的表格。上传的图片需要调整大小并上传到s3存储区。之后,我得到s3 url并保存到Post对象。但是我在调​​整大小和上传时遇到了一些问题。这里是我的代码:Symfony3表格:调整上传图片的大小

表单控制器:

public function newAction(Request $request) 
{ 
    $post = new Post(); 
    $form = $this->createForm('AdminBundle\Form\PostType', $post); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $img = $form['image']->getData(); 
     $s3Service = $this->get('app.s3_service'); 

     $fileLocation = $s3Service->putFileToBucket($img, 'post-images/'.uniqid().'.'.$img->guessExtension()); 

     $post->setImage($fileLocation); 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($post); 
     $em->flush(); 

     return $this->redirectToRoute('admin_posts_show', ['id' => $post->getId()]); 
    } 

    return $this->render('AdminBundle:AdvertPanel:new.html.twig', [ 
     'advert' => $advert, 
     'form' => $form->createView(), 
    ]); 
} 

app.s3_service - 服务,我用户调整和上传图片

public function putFileToBucket($data, $destination){ 

    $newImage = $this->resizeImage($data, 1080, 635); 

    $fileDestination = $this->s3Service->putObject([ 
     "Bucket" => $this->s3BucketName, 
     "Key" => $destination, 
     "Body" => fopen($newImage, 'r+'), 
     "ACL" => "public-read" 
    ])["ObjectURL"]; 

    return $fileDestination; 
} 

public function resizeImage($image, $w, $h){ 
    $tempFilePath = $this->fileLocator->locate('/tmp'); 

    list($width, $height) = getimagesize($image); 

    $r = $width/$height; 

    if ($w/$h > $r) { 
     $newwidth = $h*$r; 
     $newheight = $h; 
    } else { 
     $newheight = $w/$r; 
     $newwidth = $w; 
    } 

    $dst = imagecreatetruecolor($newwidth, $newheight); 
    $image = imagecreatefrompng($image); 
    imagecopyresampled($dst, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

    file_put_contents($tempFilePath, $dst); 
    return $tempFilePath; 
} 

但我得到的错误:

Warning: file_put_contents(): supplied resource is not a valid stream resource 

回答

0

我认为这个问题是你想如何保存图像file_put_contents()你正在处理由gd使用的特殊图像资源必须转换成适当的,例如, PNG,文件。

它看起来像你使用GD,它提供了一个方法imagepng(),你可以用它来代替。您可以在文档中的例子还有:http://php.net/manual/en/image.examples.merged-watermark.php

换句话说替代:

file_put_contents($tempFilePath, $dst); 

有:

imagepng($dst, $tempFilePath);