使用vuejs和laravel将嵌套数据与文件一起存储

时间:2018-10-15 18:06:41

标签: laravel vue.js file-upload

我有一张表格,其中包含有关少数几个实体的信息:公民,护照,护照扫描。

我需要保存与公民之间的关系,同时上传护照扫描图像。

我最终在客户端有了一个看起来像这样的对象:

enter image description here

但是我不知道如何存储扫描结果,因为我无法从laravel的$request->file(...)方法中得到任何信息(它返回null)。

就我而言,所有这些实体必须保持一致,我的意思是,在没有护照或没有扫描护照的情况下存储公民的情况就不会出现。

所以我不确定在这种情况下如何存储扫描结果,因为我不能在formData对象中使用嵌套数据。

2 个答案:

答案 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);
    });
  

受到Spatie media lib

的启发

foreignCitizen.passports.*.scans.*.data => 'required|base64:image/jpeg'。 现在我们有了一个有效的base64映像,我们可以安全地存储它。

我喜欢使用Spatie media libraryaddMediaFromBase64()方法。 您也可以手动转换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)还没有解决,我也可以帮忙。