在Laravel中上传图片时遇到问题。有时,图像需要重新定向-使用Intervention图像进行此操作时,它仅返回布尔值而不是s3中图像的路径。在没有干预图像的情况下使用它时效果很好
我尝试exif读取数据并使用imagerotate
无济于事,它出错了
我运行以下
$image = $request->file('photo');
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
dd($path); // /users/1/posts/39grjigrje.jpg
$path
变量很好,它是s3路径,但是正在运行:
$image = $request->file('photo');
$image = \Image::make($image);
$image->orientate();
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
dd($path); // true
$path
变量只是一个布尔值,不返回存储的文件路径
我希望有一条路径,例如/images/1/kfjeieuge.jpg
,当我不使用干预图像时得到,当我使用干预时得到布尔值。
答案 0 :(得分:2)
几年前,我也面临过同样的问题。我通过以下步骤解决了这个问题:
1。您可能需要在对图像进行干预后对其进行编码。 要实现编码,请参考以下有关流方法的文档:Create encoded image stream
以给定的格式和给定的图像质量对当前图像进行编码,并基于图像数据创建新的PSR-7流。
$image = Image::make(request()->file('image'))->orientate()->encode('jpg');
2。然后将其与流一起存储
$path = Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image->stream(),'public');
这应该可以实现您的目标。
答案 1 :(得分:1)
在第一个示例中:
$image = $request->file('photo');
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image,
'public');
$ request-> file('photo')文件将返回Illuminate \ Http \ UploadedFile类的实例。您可以在link文档中进行检查。
正如塔伦(Tarun)所说,“ put”方法检查Illuminate \ Http \ UploadedFile类的实例。因此,在这种情况下,它将成功上传。
在第二个示例中:
$image = $request->file('photo');
$image = \Image::make($image); //here
$image->orientate();
$path = \Storage::disk('s3')->put('users/' . \Auth::id() . '/posts', $image, 'public');
您正在用实例“ Image”类(第二行)覆盖“ $ image”变量。哪有错您需要传递流或文件。
尝试以下代码:
$image = $request->file('photo');
$image = \Image::make($image); //here
$image->orientate()->encode('jpg');
$filename = time() . '.jpg';
$path = \Storage::disk('s3')->put('users/' . \Auth::id() . '/posts/'.$filename, $image->getEncoded(), 'public');
答案 2 :(得分:0)
您可以按照以下链接中的说明进行解决
https://laracasts.com/discuss/channels/laravel/saving-an-intervention-image-instance-into-amazon-s3
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image->stream()->__toString(), 'public');
更新:7月5日
如果您查看源代码,应该只返回bool
/**
* Write the contents of a file.
*
* @param string $path
* @param string|resource $contents
* @param mixed $options
* @return bool
*/
public function put($path, $contents, $options = [])
{
$options = is_string($options)
? ['visibility' => $options]
: (array) $options;
// If the given contents is actually a file or uploaded file instance than we will
// automatically store the file using a stream. This provides a convenient path
// for the developer to store streams without managing them manually in code.
if ($contents instanceof File ||
$contents instanceof UploadedFile) {
return $this->putFile($path, $contents, $options);
}
return is_resource($contents)
? $this->driver->putStream($path, $contents, $options)
: $this->driver->put($path, $contents, $options);
}
正如您所看到的,Stream
和file
的处理方式不同
理想的情况是使用url
函数来获取网址
Storage::disk('s3')->url($filename)
答案 3 :(得分:0)
尝试一下
$image = \Image::make($request->file('photo')->getRealpath());
$image->orientate();
$image->encode('jpg');
OR
$image->response('jpg', 100);
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');