为了让您了解我要做什么,这是我当前的代码
当对特定URL发出发布请求时,将运行此代码
public function uploadImage(Request $request) {
$request->file = base64_decode(explode(',', $request->file)[1]);
$request->validate([
'file' => 'image|required|mimes:jpg,png',
]);
$image = $request->file('file');
$complete = $image->getClientOriginalName();
$name = pathinfo($complete, PATHINFO_FILENAME);
$extension = $image->getClientOriginalExtension();
$storageName = $name.'_'.time().'.'.$extension;
Storage::disk('public')->put($storageName, File::get($image));
return Storage::disk('public')->path($storageName);
}
第一行,我试图变得聪明,首先将base64解码为一个文件(如果我正确的话?)。
接下来是一个验证,用于验证请求中的file
参数是否存在,是否是图像以及是.jpg
还是.png
(接下来的几行仅是将“图像”保存到文件系统中)
但是验证不会通过,因为file
参数不是图像。所以我的问题是:是否可以在Laravel中将base64字符串转换为有效图像?如果是这样,如何实现?
答案 0 :(得分:0)
Laravel无法将base 64字符串解析为文件,因此文件验证器失败。您也将无法使用->file('file')
访问数据,因为同样,您也没有通过有效的文件上传进行发送。
相反,您可以进行自己的简单字符串检查(可能是data:image
的索引,或者最好是更广泛的索引,例如imagecreatefromstring
)或调查writing a custom Laravel validation rule,然后保存发送的字符串放入file_put_contents
的文件中。
如果您实际上要进行文件上传并将其转换为服务器端的base 64,则需要使用<input type="file">
。从那里,您将能够使用内置的Laravel验证和文件存储功能。 Refer to this extensive guide.一旦获得文件,就可以使用base64_encode
(see this answer for a more thorough guide)将其转换为base64。
我知道这个答案不是很具体,但是如果您确切说明您要做什么,我可以提供更多动手指导。
答案 1 :(得分:0)
您可以有效映像 base64
请一步一步跟随我:
1。转到文件夹yourProjectName \ app \ Providers \ AppServiceProvider.php
2。复制此代码,并将其复制到此文件中的函数 boot()
Validator::extend('is_image', function ($attribute, $value, $parameters, $validator) { preg_match_all('/([^\.]+)\.([a-zA-Z]+)/',$value,$matchedExt); if (isset($matchedExt[2][0]) && in_array($matchedExt[2][0],$parameters)) return true; preg_match_all('/data\:image\/([a-zA-Z]+)\;base64/',$value,$matched); $ext = isset($matched[1][0]) ? $matched[1][0] : false; print_r($value); return in_array($ext,$parameters) ? true : false; });
public function uploadImage(Request $request) { $request->validate([ 'file' => 'image|required|is_image:jpg,png', ]); $image = $request->file('file'); $complete = $image->getClientOriginalName(); $name = pathinfo($complete, PATHINFO_FILENAME); $extension = $image->getClientOriginalExtension(); $storageName = $name.'_'.time().'.'.$extension; Storage::disk('public')->put($storageName, File::get($image)); return Storage::disk('public')->path($storageName); }
希望我能为您解决问题
答案 2 :(得分:0)
我正在使用此代码将base64字符串转换为图像:
public function getImage($img, $pid)
{
if($img == "")
return null;
$imagecode = base64_decode($img);
$directory = public_path('img/uploads/x' . $pid);
if (!file_exists($directory))
\File::makeDirectory($directory);
$id = uniqid('img_');
$filename = time() . '-' . $id . '.png';
$path = public_path('img/uploads/product_img/p' . $pid . '/' . $filename);
$tpath = public_path('img/uploads/product_img/p' . $pid . '/small-' . $filename);
try {
$image = Image::make($imagecode)->widen(600, function ($constraint) {
$constraint->upsize();
})->save($path);
$image->fit(200, 200)->save($tpath);
} catch (Exception $e) {
return null;
}
return "x" . $pid . "/" . $filename;
}