【问题标题】:Laravel : Upload 64base image instead of normalLaravel:上传base64图像而不是普通图像
【发布时间】:2021-05-03 17:14:10
【问题描述】:

我有一个使用 ReactLaravel 的应用程序来上传图片。 我正在使用Laravel Image Intervention package

在测试我的 API 时,正常图像的上传工作完美。

使用 React,用户可以从他的电脑中选择一个图像并对其进行裁剪,然后他会将预览视为生成的裁剪后的 64base 图像

我想将生成的 64base 图片上传到我的数据库,而不是普通的,该怎么做?

Fileupload controller

 public function Store(Request $request)
    {
 $this->validate($request, [
 'filename' => 'image|required|mimes:jpeg,png,jpg,gif,svg'
 ]);
 $originalImage= $request->file('filename');
 $thumbnailImage = Image::make($originalImage);
 
 // Define upload path
 $originalPath = public_path('/images/');
 
 // Save Orginal Image
 $thumbnailImage->save($originalPath.time().$originalImage->getClientOriginalName());
 
 // Save In Database
 $imagemodel= new Photo();
 $imagemodel->photo_name=time().$originalImage->getClientOriginalName();
 $imagemodel->save();
 
 return back()->with('success', 'Image Upload successful');
 
    }

【问题讨论】:

  • 我建议不要这样做。 1. 上传需要更长的时间,并且可能会在较大的文件上超时,2. 您将受益于在服务器端上传原始图像和裁剪(用户选择的内容) - 在这种情况下,裁剪图像是很容易的原图稍后再看。
  • @Gordon Freeman 我明白了。但其实我有一个想法。为什么不直接把64base的代码传到数据库里直接加载呢?
  • 这通常取决于您的数据库和您的应用程序。我不会将 base64 图像存储在数据库中,原因有多种:1. 它们的交付速度会慢得多,2. 数据库会占用比必要更多的空间,3. 数据库上的负载会更多(很贵)
  • @Gordon Freeman 你得到了非常有趣的观点。但目前用户无法上传然后裁剪图像。所以我想我会直接将 64base 代码上传到服务器,因为 1.我正在上传小头像文件 2.我在前端设置了上传大小的限制。所以我认为这是一个很好的解决方案,你觉得呢?
  • 应该可以。我们经常使用cropperjs。我们解决上传问题的方式是,我们将 x、y、width、height 参数与上传的文件一起传递给服务器。然后保存图像的路径和上述参数,并使用 InterventionImage 处理所有裁剪。工作得很好。

标签: php mysql laravel intervention


【解决方案1】:

这个应该可以的

$folderPath = "images/";

$image_parts = explode(";base64,", $request->file('file'));
$image_type_aux = explode("image/", $image_parts[0]);
$image_type = $image_type_aux[1];
$image_base64 = base64_decode($image_parts[1]);
$file = $folderPath . uniqid() . '. '.$image_type;

// file_put_contents($file, $image_base64);
Storage::put($file, $image_base64);

可能的替代方案:

$image =  Image::make(base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $request->file('file'))))->stream();
Storage::put($file, $image, 'public');

【讨论】:

  • 感谢您的回复。但这与将base64传递给数据库不一样吗?我看到您的代码拍摄了图像并进行了转换。我可能错了。
  • 没有。存储将其放入您的文件系统(或云)。所以你的网络服务器(Apache/Nginx)将负责它
  • 我明白了。所以它需要 64 图像并将其实际存储为普通图像。
  • 是的。这就是想法。我没有测试这段代码,但我认为它应该可以工作。也许在$request->file('file') 周围放一个file_get_contents
  • 稍后我会看看是否可以将其放入我的代码中。但我肯定会使用你的解决方案。非常感谢。
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2015-11-29
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多