我有一张表格,其中包含有关少数几个实体的信息:公民,护照,护照扫描。
我需要保存与公民之间的关系,同时上传护照扫描图像。
我最终在客户端有了一个看起来像这样的对象:
但是我不知道如何存储扫描结果,因为我无法从laravel的$request->file(...)
方法中得到任何信息(它返回null)。
就我而言,所有这些实体必须保持一致,我的意思是,在没有护照或没有扫描护照的情况下存储公民的情况就不会出现。
所以我不确定在这种情况下如何存储扫描结果,因为我不能在formData对象中使用嵌套数据。
答案 0 :(得分:0)
Base64不在请求文件中,您必须读取字符串并将其转换回映像$request->get('foreignCitizen.passports[0].scans[0]')
。另一种选择是将人员和后者存储起来,并使用FormData提交护照文件,以便POST / person / 1 / scans将文档附加到人员1。
使用此验证器,您可以验证图像。
Validator::extend('image64',function($attribute, $base64Data, $mimeTypes, $validator) {
// strip out data uri scheme information (see RFC 2397)
if (strpos($base64Data, ';base64') !== false) {
[$_, $base64Data] = explode(';', $base64Data);
[$_, $base64Data] = explode(',', $base64Data);
}
// strict mode filters for non-base64 alphabet characters
if (base64_decode($base64Data, true) === false) {
return false;
}
// decoding and then reeconding should not change the data
if (base64_encode(base64_decode($base64Data)) !== $base64Data) {
return false;
}
$image = base64_decode($base64Data);
$file = finfo_open();
$type = finfo_buffer($file, $image, FILEINFO_MIME_TYPE);
return in_array($type, $mimeTypes);
});
的启发
foreignCitizen.passports.*.scans.*.data => 'required|base64:image/jpeg'
。
现在我们有了一个有效的base64映像,我们可以安全地存储它。
我喜欢使用Spatie media library和addMediaFromBase64()
方法。
您也可以手动转换base64字符串并将其存储为文件。
如果选择拆分过程,请先存储人员,然后再存储图像。这可能更容易实现,并且后端的代码更少。
答案 1 :(得分:0)
就在昨天,我遇到了这个完全相同的问题,终于有了解决方案。在这里:
Laravel文档没有说明,或者至少我找不到它,但是您也可以像其他任何字段一样访问上载的文件,例如:$ reques-> uploadedFile并使用它像这样存储它
Storage::putFile('public', $request->uploadedFile);
因此在您的示例中,您可以像这样存储扫描:
Storage::putFile('public', $request->foreignCitizen['passports'][0]['scans'][0]);
通常,您肯定知道如何应用一些for循环以使其更易于管理。
PS:您没有提到是否已经整理了将带有嵌套文件的对象发送到laravel的部分,但是就像我说的那样,如果您仍然遇到同样的问题(vuejs / laravel)还没有解决,我也可以帮忙。